468 字
2 分钟
8086从汇编语言代码到实际执行
汇编语言代码到实际执行
程序员编写汇编程序,汇编程序由编译器编译得到机器码,机器码由计算机执行。
首先使用编辑器书写 源程序文件.asm;然后经过编译步骤,生成 目标文件.obj;再然后经过链接步骤,生成 可执行文件.exe
汇编语言程序代码由伪指令和汇编指令构成,伪指令是指没有对应机器码的指令,最终不被 CPU 所执行。那么谁来执行伪指令呢?伪指令是由编译器来执行的指令,编译器根据伪指令进行相关的编译工作。汇编指令,对应有机器码的指令,可以被编译为机器指令,最终被 CPU 执行。
assume CS:codesg
codesg segment
mov ax, 0123H
add bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H
int 21H
codesg ends
end
其中,
assume CS:codesg
codesg segment
……
……
……
codesg ends
end
为伪指令
mov ax, 0123H
add bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H
int 21H
为汇编指令
mov ax, 4c00H
int 21H
程序结束运行后,将 CPU 的控制权交还给运行它的程序,比如 DOS 系统
编写汇编代码时的符号约定
数字
——立即数
[]
—— 对应的地址
()
—— 寄存器或者内存单元中对应的值 (约定)
idata
—— 立即数 (约定)
Loop 指令的实现
CPU 是如何执行 loop 指令的过程的:
(cx) = (cx) - 1
判断 cx 中的值
不为零则转至标号处执行程序
如果为零则向下执行
添加段前缀
段前缀产生的原因:在汇编程序中,如果书写,mov al, [0],在编译连接之后,这里的[0]被识别为常数,这时候需要加上段前缀来表示,这个[0]是一个地址。
表示方法:mov al, ds:[0]