汇编第四章
4.1一个汇编语言程序(源程序)从写出到执行的过程
编写->编译连接->执行
(2)使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件;再用连接程序(LINK.EXE)对目标文件进行连接,生成可在操作系统中直接运行的课执行文件。
可执行文件中包含两部分
程序和数据
相关信息(程序大小)
(3)执行可执行文件中的程序
操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据叫载入内存,并进行相关的初始化(比如:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。
4.2 源程序
INT 21H是DOS的中断调用
https://blog.csdn.net/chinazeze/article/details/1735621
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
汇编指令
有对应的机器码的指令,可以被编译位机器指令,最终为CPU所执行
// mov add sub jmp
伪指令
除了汇编指令,别的都是伪指令
没有对应的机器码的指令,最终不被CPU所执行
伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作
XXX segment
XXX ends
end //是一个编译程序的结束标记,记得在结尾加
assume //寄存器与段的关联假设
定义一个段
segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必要用到的一对伪指令。
segment和ends的功能是定义一个段,segment说明一个段的开始,ends说明一个段结束。
一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。
汇编源程序:
伪指令 (编译器处理)
汇编指令(编译为机器码)
源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行处理的指令或数据称为程序。
标号
标号指代了一个地址
Codesg:放在segment的前面,作为一个段的名称
assume name
name segment
mov ax,2
add ax,ax
add ax,ax
name ends
end
DOS中的程序运行
DOS是一个但任务操作系统。
程序返回
应该在程序的末尾添加返回的程序段
mov ax,4c00H
int 21H
这两条指令所实现的功能就是程序返回。
Masm 1.asm;
Link 1.obj;
1.exe
连接的作用
当源程序很大时,可以将它分为多个源程序文件来编译,每个源文件编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
程序中调用了某个库文件中的子程序,需要将这个库文件的该程序生成的目标文件连接到一起,生成一个可执行文件;
对于连接的过程,可执行文件是我们要得到的最终结果
4.8可执行文件中的程序装入内存并运行的原理
在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2,将P1从可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;
当P1运行完毕后,应该将CPU的控制权交给使它得以运行的程序P2
操作系统的外壳
操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为shell(外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统工作。
(cmd)
编程->1.asm->编译->1.obj->连接->1.exe->加载->内存中的程序->运行
Edit masm link command cpu
4.9程序执行过程的跟踪
Debug可以将程序载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU的控制,这样,我们就可以使用Debug的相关命令来单步执行程序,查看每一条指令的执行结果
PSP占256(100H)字节,所以程序的物理地址是:
SA16+0+256=SA16+16*16=(SA+16)*16+0
用u命令查看一下其他指令
-u 103e:0 100H
用T命令来单步执行与查看每条指令
到了int 21,我们要用P命令执行