1、几个指令
(1)、汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行;
(2)、伪指令:没有对应的机器码的指令,最终不被CPU所执行;
伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作;
(3)、segment和ends是一对成对使用的伪指令,这是在写被编译器编译的汇编程序时,必须要用到的一对伪指令;
(4)、segment和ends的功能是定义一个段,segment说明一个段的开始,ends说明一个段的结束。
(5)、一个段必须有一个名称来标识,使用格式:段名 segment .....段名ends;
(6)、一个有意义的汇编程序至少要有一个段,这个段用来存放代码;
(7)、end(伪指令)是汇编程序结束的标记;程序结束时必须加上end,否则,编译器在编译程序时,无法知道程序在何处结束;
(8)、assume:含义"假设",定义段寄存器和程序中的段相关联的,编译程序时段寄存器可以和某一个具体的段相联系;
2、汇编源程序
程序:源程序中最终由计算机执行、处理的指令或数据;
(1)、伪指令:编译器处理;
(2)、汇编指令:编译为机器码;
(3)、标号:一个标号指代了一个地址,codesg:放在segment前面,作为一个段的名称,这个段的名称最终被编译、连接程序处理为一个段的段地址;
(4)、程序的返回:一个程序结束后,将CPU的控制权交还给使它得以运行的程序,这个过程就是"程序返回";返回的程序段:mov ax,4c00H int 21H
3、结束
(1)、段结束:ends 编译器执行
(2)、程序结束:end 编译器执行
(3)、程序返回:mov ax,4c00H int 21H 由CPU执行
4、汇编程序
汇编程序的扩展名:.asm
汇编程序的注释:;
源代码(没有汇编代码格式,只能用C语言的格式上传代码了):
下面的这个程序是没有入口的:
assume cs:abc
abc segment ;定义一个abc段
mov ax, 2
add ax, ax
add ax, ax
mov ax, 4c00H
int 21H
abc ends
end
进行编译--->链接---->执行;
此时我们必须的下载汇编的编译工具:MASM6.15;
下面的执行都是在DOS下面进行的,先到我们要执行的目录中去。
(1)、第一种执行方案:
编译:masm 1.asm;
链接:link 1.obj;
执行:1.exe
(2)、第二种执行方案:
编译和链接:ml 1.asm
执行:1.exe
结果图:
5、准备工具
编写汇编需要准备的工具:编辑器(Notepad++/UE)、编译器(masm)、连接器(link)、调试工具(debug)winxp是自带的...
Debug可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU的控制,这样,我们就可以使用Debug的相关命令来进行单步执行程序,查看每条指令的执行结果。
6、有入口的汇编程序
代码如下(没有汇编代码格式,只能用C语言的格式上传代码了):
assume cs:codesgcodesg segmentstart: mov ax, 0123H mov bx, 0456H add ax, bx add ax, ax mov ax, 4C00H int 21Hcodesg endsend start
执行debug 1.exe(对这个汇编程序进行加载)就可以进行Debug的单步调试了;
总结:
(1)、程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为0,则程序所在的内存区的地址为:ds:0;
(2)、这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信;
(3)、从256字节处向后的空间存放的是程序;
7、程序执行过程的跟踪
(1)、U命令查看本汇编程序其他指令,R可以查看当前寄存器的值并可以修改CS:IP的值;
(2)、T命令单步跟踪;
(3)、执行到INT 21,用P命令正常结束;
8、加载原理
(1)、DOS中用“debug 1.exe”运行debug对1.exe进行跟踪,程序加载顺序:command加载debug,debug加载1.exe;
(2)、按q命令退出debug模式;
返回的顺序:从1.exe程序返回到debug,从debug返回到command。
本文出自 “wait0804” 博客,请务必保留此出处http://wait0804.blog.51cto.com/11586096/1867385