diff --git "a/homeworks/\344\271\235\345\244\251/IceGone" "b/homeworks/\344\271\235\345\244\251/IceGone" new file mode 100644 index 0000000..8e4ae18 --- /dev/null +++ "b/homeworks/\344\271\235\345\244\251/IceGone" @@ -0,0 +1,21 @@ +子程序 + +2018年1月24日 +17:28 + +汇编语言:参数的传递是靠寄存器或堆栈来完成的 +高级语言:子程序(函数/过程)依赖于堆和栈来传递 +C/C++/BASIC/Pascal子程序的执行过程基本一致: + Ø 将子程序执行完成时应返回的地址/参数压入堆栈 + Ø 子程序使用bp指针+偏移量对栈中的参数寻址,并取出,完成操作 + Ø 子程序使用RET或RETF指令返回,此时,CPU将ip置为堆栈中保存的地址,并继续给予执行 +CALL指令的参数是被调用子程序的地址。 +CALL和RET,一级ENTER和LEAVE配对,以实现对堆栈的自动操作,而不需要程序员进行PUSH/POP,以及跳转的操作,提高了效率。 +中断:一类特殊的子程序,由系统调用,以响应突发事件。 +DMA方式:CPU向控制器发出指令,要求外设和内存直接交换数据,而不通过CPU。 +调用中断的指令:int 中断号 (引发CPU去调用一个中断,CPU将保存单钱的程序状态字,清除trap和interrupt两个标志,将即将执行的指令压入堆栈,并调用中断服务) +中断服务程序很多时候必须写成可重入代码(程序的运行过程中可以被打断,并由开始处在此执行,并且执行结果不受影响),尽量使用寄存器。 +调用软件中断时,通常都是通过寄存器传进、传出参数。这意味着你的int指令周围也许会存在一些“帮手”, +通过调用DOS中断服务返回父进程,并带回错误找反馈码0。其中,ax中的数据4c00h就是传递给DOS中断服务的参数。 +mov ax,4c00h +int 21h