一、第一个程序
1.一个源程序从写出到执行的过程
汇编语言由三部分组成:
- 汇编指令(机器码的助记符)*核心
- 伪指令(由编译器执行)
- 其他符号(由编译器识别)
对源程序进行编译连接
- 使用MASM.EXE对源程序文件中的源程序进行编译,产生目标文件
- 再用LINK.EXE对目标文件进行连接,生成可在操作系统中直接运行的可执行文件
可执行文件包括两部分内容
- 程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
- 相关的描述信息(比如:程序有多大,要占多少内存空间等等)
assume cs:codesg
;assume:含义为“假设”,它假设某一段寄存器和程序中的某一段用segment...ends定义的段相关联
;assume(假设) cs(代码段):codesg(命名)
codesg segment
;segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令
;segment和ends的功能是定义一个段,segment表示一个段的开始,ends表示一个段的结束
;一个段必须有一个名称来标识,使用格式为:段名 segment/ends
start: mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00H
int 21H
;由start开始到int结束的是汇编指令(有对应的机器码的指令,可以被编译为机器指令,最终为CPU执行)
;其余都是伪指令,不被CPU执行,没有对应机器码,由编译器执行
codesg ends
end start
;End是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。
;一个汇编程序是由多个段组成,这些段被用来存放代码、数据或当作栈空间使用
;一个有意义的汇编程序必须至少有一个段,这个段用来存放代码
2.源程序
标号
一个标号指代了一个地址
codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。
程序的结构
任务:编程运算2^3
- 定义一个段
- 实现处理任务
- 程序结束
- 段与段寄存器关联
assume cs:abc;4
abc segment;1
mov ax,2;2
add ax,ax;2
add ax,ax;2
abc ends;1
end;3
DOS中的程序运行
DOS是一个单任务操作系统
s一个程序B在可执行文件中,则必须有一个正在运行的程序A(DOS),将B从可执行文件中加载入内存后,将CPU的控制权交给B后,B才得以运行。B运行后,A暂停运行。
而当B运行完毕后,应该将CPU的控制权交还给使他得以运行的程序A,此后,A继续运行。
程序返回
- 我们的程序最先以汇编指令的形式存在源程序中,经过编译、连接转变为机器码,存储在可执行文件中。
- 现在我们知道,一个程序结束后,将CPU的控制权交还给使他得以运行的程序,我们称这个过程为:程序返回
- 应该在程序的末尾段加返回的程序段:mov ax,4c00H int 21H (中断机制) 这两条指令所实现的功能就是程序返回
上机操作:
环境搭配请参考汇编语言学习篇2——MASM的环境搭建(win10与Ubuntu1604下的配置)【有问题,待更正】-CSDN博客1.exe的执行
我们的程序没有像显示器输出任何信息,程序只是做了一些将数据送入寄存器和加法操作,而这些事情,我们不可能从显示屏上看出来。
编译连和接的作用:
- 当程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将他们连接到一起生成一个可执行文件。
- 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件。
- 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。
- 所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理
3.程序执行过程的跟踪
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
以上述程序text2.exe为例
可以看到,Debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度,text2.exe中程序的机器码共有15字节
- 用R命令查看当前
- 用U命令查看一下其他指令
- 用T命令执行程序中的每一条指令,并观察每条指令的执行结果。
- 到了int21,我们要用P命令来结束
- int21执行结束后,显示“Program terminated normally”表示程序正常结束返回Debug
需要注意的是,在DOS中运行程序时,是commend将程序加载入内存;所以程序运行结束后返回到commend中,而在这里是Debug将程序加载入内存,所以程序运行结束后要返回到Debug中。
使用Q命令推出Debug,将返回到commend中,因为Debug是由commend加载运行的。
二、[BX]和loop指令
2.1 [bx]
(好吧我其实挺讨厌汇编的,先去学学Python和java吧还是QAQ)