总探声息头领

导航

汇编知识

POP ax,是把栈顶元素出栈赋给ax

call s(标号)  将 IP入栈然后在跳转到s,即

push IP

Jmp S

ret指令是将 出栈到IP,即

POP IP

call 和ret 指令放在一起用,可以实现程序的转移,可以实现中断,

IP是CS:IP中的IP,即代码段执行的一部分


内存分配就是与CPU连接的存储部分,CPU都将它们分配了地址,然后通过寄存器去读写操作,外部设备里都有电路,电路里都有一个寄存器,CPU就是通过寄存器与它们读写,所以一切的操作都是CPU读写控制操作,


我们来分析一个call 和ret 结合使用的例子:

assume cs:code  (假设程序从1000:0处装入)
stack segment
    db 8 dup(0)  1000:0000  00 00 00 00 00 00 00 00
    db 8 dup(0)  1000:0008  00 00 00 00 00 00 00 00
stack  ends
 
code  segment
start:   mov ax,stack  1001:0000    B8 00  10
         mov ss,ax                  8E D0
         mov sp,16                  BC 10  00
         mov  ax,1000               B8 E8  03
         call  s       1001:000B    E8 05  00
         mov ax,4c00h  1001:000E
         int 21h
       s:add ax,ax     1001:0013    03 c0
         ret           1001:0015    c3
code  ends                                                                                                                                                  

这个程序的执行的大概过程就是:

(1) 定义了一个栈,(db是定义一个byte型数据,dup即duplicate 重复的意思,它是一个重复的命令,括号里的东西重复n遍)

1000:0000    00  00  00  00  00 00 00 00 00 00 00 00 00 00 00  00 

ss:sp

(2) call 指令读入后,(IP)=000EH(IP是代码段执行的cd:ip的一个,怎么算的 呢,就是看机器码的数目,IP计算的都是指令的机器码的位数,读入之后,IP就指向下一条指令)

CPU指令缓冲寄存器中为:E8 05 00   cpu 执行E8 05 00,首先,将IP入栈,栈中的情况变为:

1000:0000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00

    ss:sp

然后(IP)=(IP)+0005H=0013H,转到s出执行

(3) ret 指令读入后,(IP)=0016H,ret的作用是将当前ss:sp指向的内容出栈赋给IP,CPU指令缓冲区中的代码为:C3 ,CPU执行C3(原来CPU执行指令是执行指令的机器码,花擦),  相当于进行  POP IP,所以(IP)=000EH

(4)CPU回到cd:000EH出执行(即call后面的指令)继续执行。


通过分析这段程序,我们可以用call,ret指令设计子程序


接下来我们就要破中断了,中断这个很有意思,它是根本性的东西


posted on 2016-06-08 19:06  总探声息头领  阅读(182)  评论(0编辑  收藏  举报