第一个汇编程序
文章目录
- 第一个汇编程序
- 1.汇编模拟程序:DOSBox使用
- 2.汇编程序从写出到执行的过程
- 3.程序执行过程跟踪
1.汇编模拟程序:DOSBox使用
BOSBox软件常用基本语法:
mount c: d:\masn ;挂载磁盘,挂载后用c:切换为C盘才能用debug等工具
dir ;查看当前磁盘
debug ;使用debug工具
-r 寄存器名 ;查看cpu寄存器的内容
-d ;查看内存中的内容 ;扩展用法: -d 段地址:偏移地址 结果偏移地址,如 -d 1000:0 9 代表地址1000:0~1000:9
-e 内存内容 ;改写寄存器内存中的内容
-u ;查看内存中机器码含义
-T ;执行内存中的机器码
-a ;以汇编指令的形式在内存中写入机器指令
-q ;退出debug工具
一点使用细节:
- 在使用DOSBox的使用一定要先挂载磁盘,否则无法使用debug工具
- 不要直接在自己电脑上使用DOSBox软件,因为你修改的寄存器可能是存储系统文件的寄存器,改了系统就崩了
伪指令与汇编代码的含义:
- 在汇编语言中有两种指令:汇编指令和伪指令
- 汇编指令:是指对应的机器码指令,可以被编译为机器指令,最终为CPU执行
- 伪指令:是指没有对应的机器指令,最终不被CPU所执行,由编译器执行的执行(编译器根据伪指令来进行相关的编译工作)
常见的伪指令含义:
assume:这条伪指令含义是"假设"。它假设某一段寄存器和程序中的某一个用segment…ends定义的段相关联
segment与ends:segment和ends是一对成对使用的伪指令。segment和ends的功能是定义一个段,segment说明一个段开始,ends说明一个段结束。一个段必须有一个名称来表示
end:end是一个汇编语言结束标记,编译器在编译汇编程序的过程中,如果遇到伪指令end,就结束对源程序的编译
idata:表示常量
db:定义字节类型的意思
dw:定义字类型的意思
比如:
- mov ax,[idata] 可以表示 mov ax,[1] mov ax,[2]等
- mov bx,idata 可以表示mov bx,1 mov bx,2等
- mov ds,idata 可以表示mov ds,1 mov ds,2等,但是这样是非法指令,因为ds寄存器不支持直接将数据送入ds寄存器
;举例格式 assume cs:codesg ;assume+自定段名称 codesg segment ;格式:段名称+segment mov ax,0123H mov bx,0456H add ax,bx add ax,ax mov ax,4C00H int 21H codesg ends ;格式:段名称+ends end ;结束标志
2.汇编程序从写出到执行的过程
- Edit(编写)
- masm(编译)
- link(连接)
加载后,CPU的CS:IP指向程序的第一条指令(即程序的入口)
//1.asm程序
assume cs:codesg ;将用作代码段的段codesg和段寄存器cs联系起来。
codesg segment ;定义一个段,段的名称为“codesg”,这个段从此开始
;codesg是一个标号,作为一个段的名称,最终被编译连接成一个段的段地址
mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H
int 21H ;这两条指令实现程序的返回
codesg ends ;名称为“codesg”的段到此结束
end ;//编译器在编译汇编程序的过程中,碰到了伪指令end,结束对源程序的编译
3.程序执行过程跟踪
先给结论:DS和CS段之间有256(也就是100H)的通信区,用于DOS跟程序通讯
这也是为什么(ds)=0B2DH,但程序在0B3D:0(100H就是10:0)处开始执行的原因