汇编知识
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指令设计子程序
:
接下来我们就要破中断了,中断这个很有意思,它是根本性的东西