当前位置: 汇编教程 > 03-指令系统 > 阅读正文

汇编 程序的执行过程

2021.7.11.   723 次   1123字

汇编程序,最先以汇编指令的形式存在源程序中, 经过编译,连接后转变为机器码,存储在可执行文件中

在单任务操作系统中,例如远古版本的dos,一个程序p2是不能自动执行的,而是被一个正在执行的程序p1调用,将p2加载到内存中后,将cpu的控制权交给p2,p2才得以运行,p2执行完毕后放弃cpu,将cpu控制权交还给p1,”交换cpu“这个动作,称之为程序的返回

程序返回代码

在汇编中, 应该在程序的末尾添加返回的程序段

mov ax, 4c00H
int 21H

这两条指令实现的就是程序返回,添加返回代码这样才能正确返回

程序的入口

在执行程序时,会找到一个入口地址,即指定cs:ip的值,编写一个程序,并指定入口(如果没有指定入口,默认会从第一条指令开始)

assume cs:codesg

codesg segment

start: mov ax, 0123H
       mov bx, 0456H
       add ax, bx
       add ax, ax

       mov ax, 4c00h
       int 21H

codesg ends

end start

入口标志,为end后面的一个变量名,也就是start,该名称可以随意修改,是一个伪指令,该标志应该指向代码段

单步调试

使用debug调试上述程序,使用r命令查看寄存器的值,发现cs比ds大了256,比如cs为076c,而ds为075c

程序加载时,系统分配一段起始地址SA:0000(SA表示段),在这段内存区的前256个字节中创建一个psp的数据区,dos要利用psp来和被加载程序进行通信,在这段内存区的256字节开始,将程序装入,程序的地址被设置为SA+10H:0,将该内存区的段地址存入DS中,初始化其他相关寄存器,设置CS:IP指向程序的入口(10H换算为16,又因为是段地址,所以*16,即256,如果数据太多,会分配更大内存,以256的倍数)

程序的正常退出

在debug中,使用t命令进行下一步调试,在执行到int 21时,使用p命令正常结束该程序,程序正常结束,系统提示program terminated normally

如果希望再次回到程序的入口,使用r ip修改ip的值,设置为0即可

如果在执行时,没有使用p命令结束,程序非正常退出,cs会自动跳转到其他段,可以使用r cs修改cs的值,让段回到入口,然后r ip设置ip为0即可

debug与masm

debug指令与masm指令不完全相同

转移指令 jmp xxx, 和 r cs,前者是masm中使用的cs修改命令,而r cs在debug中使用

赋值指令,mov ax, [0]也仅能在debug中使用,而masm中,需要mov bx, 0 加上 mov ax, [bx], 间接寻址相对于段寄存器,需要经过通用寄存器,通常使用bx,且不能使用ax,即[bx]是一个专有的用法

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群