寄存器:
SS:栈段寄存器,存放栈顶的段地址。
SP:寄存器,存放栈的偏移地址。
DS:数据段寄存器,存放数据。
CS:代码段寄存器,存放代码。
CS:IP:基地址:偏移地址。
SS:SP:任意时刻,指向栈顶元素。
ES:扩展段寄存器。
BX:灵活的寄存器。
栈
PUSH指令的执行步骤:
1. SP=SP-2
2. 向SS:SP指向的字单元中送入数据
POP指令的执行步骤:
1. 从SS:SP指向的字单元中读取数据
2. SP=SP+2
一个栈段的最大可以设为64KB。这是因为:PUSH和POP等指令在执行的时候,只修改SP的值,SS的值是固定的。固定一个栈段地址,然后修改其栈偏移地址。所以栈顶的变化范围为0~FFFFH,从空栈的时候SP=0,一直压栈,直到栈满的时候SP=0;如果继续压栈,栈顶将环绕(空栈的时候一直压栈,SP从0一直加到FFFFH,然后再加,栈满,SP又变成0,然后继续压栈,SP又从0开始加,所以栈顶会环绕)。覆盖掉原来的值,所以栈段的最大容量为64KB。
段
我们可以将一段内存定义为一个段,用一个段地址指示段,偏移地址访问段内的单元。
“数据段”:自定义的存放数据的段。数据段的段地址放在DS中。
“代码段”:自定义的存放代码的段。代码段的段地址放在CS中。段中第一条指令的偏移地址放在IP中。
“栈段”:自定义的存放栈的段。栈段的段地址放在SS中。栈顶单元的偏移放在SP中。
CPU将内存中的某段内容当成代码是因为CS:IP指向了那里。CPU将内存中的某段内容当成栈是因为SS:SP指向了那里。
源程序
在汇编语言的源程序中,包含两种指令:伪指令和汇编指令,汇编指令是有对应的机器码的指令,可以被编译为机器指令,最终被CPU所执行。而伪指令是没有与之对应的机器码的,伪指令只能由编译器来执行,编译器根据伪指令来进行相关的编译工作。
下面是一个简单的源程序:
assume CS: codesg
codesg segment
start: mov AX, 01234
mov BX, 04567
add AX, BX
add AX, AX
mov AX, 4C00H
int 21H
codesg ends
end
在这个程序中有三个伪指令:
(1)
XXX segment
……
……
XXX ends
segment和ends是一对成对使用的伪指令,是写可被编译的汇编程序时必须要使用到的一对伪指令,这对指令的功能是定义一个段,segment说明一个段的开始,ends表示一个段的结束。一个段必须有有一个名称来标识,XXX就是该段的标识。在该程序中codesg就是这个段的标识。codesg segment表示定义一个名称为“codesg“的段,这个段从此处开始。codesg ends表示该段到此结束
一个汇编程序时由多个段组成的,这些段被用来存放代码、数据或者被当做栈空间来使用。一个有意义的汇编程序中至少要有一个段,这个段被用来存放代码。
(2)end
end是一个汇编程序的结束标记,编译器在编译的时候到了end这个位置会停止编译,所以在写汇编源程序的时候一定要写end,否则编译器不知道编译到哪里结束。
注意:end和ends不同,end是源程序的结束标记。ends是和sagment成对使用,是段的结束标记。
(3)assume
这条伪指令的作用是假设,它假设某一段寄存器和程序中的某一个用sagment……ends定义的段相关联。assume将有特定用途的段和相关的段寄存器关联起来。
例如该程序中:assume CS:codesg。codesg是我们自己定义的一个段,那么这条伪指令的含义就是将codesg这个段和CS寄存器联系起来。因为CS是代码寄存器,所以codesg这个段也就属于是代码寄存器了。
源程序≠程序。
用汇编语言编写的源程序,包括伪指令和汇编指令,源程序中的汇编指令组成了最终由计算机执行的程序。而源程序中的伪指令是由编译器来处理的,伪指令并不实现我们编程的最终目的,这里所说的程序就是指源程序中最终由计算机执行、处理的指令或数据。
程序返回
一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。P2开始运行后,P1暂停运行。
当P2运行结束后,应该将CPU的控制权还给使它得以运行的程序P1,此后,P1继续运行。P2将CPU控制权交给P1的过程称为“程序返回”。
程序返回有它专门的汇编指令:
mov ax,4c00H
int 21H
这两条指令的作用就是程序返回。
相关指令 | 指令性质 | 指令执行者 | 指令目的 |
---|---|---|---|
ends | 伪指令 | 编译时,编译器执行 | 通知编译器一个段的结束 |
end | 伪指令 | 编译时,编译器执行 | 通知编译器程序结束 |
mov ax,4c00H int 21H | 汇编指令 | 程序执行时,由CPU执行 | 程序返回 |