汇编笔记四,五章
第四章:第一个程序
过程
编写》编译连接》可执行文件(1,程序.2,相关的描述信息)》执行
源程序
segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。
segment和ends的功能是定义一个段,segment说明一个段开始,ends说明一个段的结束。
一个段必须有一个名称来标识,使用格式为:
段名 segment
段名 ends
一个汇编程序是由多个段组成的,这些段被用来存放代码,数据或当作栈空间来使用。
一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
end是一个汇编程序的结束标志,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。
如果程序写完了,要在结尾处加上伪指令end。否则,编译器在编译程序时,无法知道程序在何处结束。
切记:不要搞混了end和ends。
assume:假设
它假设某一段寄存器和程序中的某一个用segment……ends定义的段相关联。
通过assume说明这种关联 ,在需要的情况下,编译程序可以将段寄存器,和某一个具体的段相联系。
汇编源程序:伪指令(编译器处理)
汇编指令(编译为机器码)
程序:源程序中最终由计算机执行,处理的指令或数据
我们可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行处理的指令或数据,成为程序。
程序最先以汇编指令的形式存在源程序中,经编译,连接后转变为机器码,存储在可执行文件中。
标号
一个标号指代了一个地址
codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译,连接程序处理为一个段的段地址。
程序返回:一个程序结束后,将cpu的控制权交还给使他得以运行的程序。
dos是一个单任务操作系统。
如何程序返回
应该在程序的末尾添加返回的程序段。
mov ax,4c00h
int 21H(中断机制:int)
这两个指令所实现的功能就是程序返回。
目的 相关指令 指令性质 指令执行者
段结束 段名 ends 伪指令 由编译器执行
程序结束 end 伪指令 由编译器执行
程序返回 mov ax,4c00H 汇编指令 由CPU执行
int 21H
语法错误和逻辑错误
语法错误:程序在编译时被编译器发现的错误;(容易被发现·)
逻辑错误:在编译时不能表现出来的,在运行时发生的错误;(不容易被发现)
exe的执行
我们的程序没有像显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能从显示屏上看出来的。
程序执行完成后,返回,屏幕上再次出现操作系统的提示符。
4.6以简化的方式进行编译和连接
;连接
连接的作用
当源程序很大,可以将他分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将他们连接到一起,生成一个可执行文件;
程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件后,再用连接程序将他们连接到一起,生成一个可执行文件;
程序中调用某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件:
一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成执行文件,连接程序将这此内容处理为最终的可执行信息。
所以在只有一个源程序文件,而又不需要调用某给库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。
工具
编辑器 编译器 连接器 调试工具
4.8可执行文件中的程序装入内存并运行的原理
在dos中,可执行文件中的程序p1若要运行,必须有一个正在运行的程序p2,
将p1从可执行文件中加载入内存,将cpu的控制权交给他,p1才能得以运行
当p1运行完毕后,应该将cpu的控制权交还给使他得以运行的程序p2.
操作系统的外壳
操作系统是由多个功能模块组成的庞大,复杂的软件系统/任何通用的操作系统,都压迫提供一个称为shell(外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统工作
dos中有一个程序command.com,这个程序在dos中称为命令解释器,也就是都是系统的shell。
过程
编程(edit)》1.asm》编译(masm)》1.obj》连接(link)》1.exe》加载(command)》内存中的程序》运行(CPU)
程序加载以后,ds中存放着程序所在的内存区的段地址,这个内存去的偏移地址为0,则程序所在的内存区的地址为:ds :0;
这个内存去的前256个字节中存放的是psp,dos用来和程序进行通信的。
所以,从我们从ds中可以得到psp的段地址sa·psp的偏移地址为0,这物理地址为sa*16+0.
例
因为psp占256(100H)字节,所以程序的物理地址是:
sa* 16+0+256=sa* 16+16*16=(sa+16) *16+0
4.9程序执行过程的追踪
用u命令查看一下其他指令;
用t命令但不执行程序中的每一条指令,并观察每条指令的执行结果
到了int 21,我们要用p命令执行;
int 21执行后,显示program terminated normally,返回到debug中。
表示程序正常结束。
(注意,要使用p命令执行int 21.)
我们在dos中用denug 1.exe运行debug对1.exe进行跟踪时,程序加载的顺序是:command 加载debug,debug加载1.exe。
返回顺序是:从1.exe中的程序返回到debug,从debug返回到command。
第五章【bx】和loop(循环)指令
【bx】:和【0】有些类似,【0】表示内存单元,它的偏移地址是0.
完整的描述一个内存单元,需要两个信息:
(1}内存单元的地址;
(2)内存单元的长度(类型)
段地址是默认在ds中
l描述性符号“()”
约定符号idata表示常量
我们在debug中写过类似的指令:mov ax,[0],表示将ds:0处的数据送入ax中。指令中在“【……】”里用一个常量0表示内存单元的偏移地址,以后,我们用idata表示常量。
mov ax,【bx】
功能:bx中存放的数据作为一个偏移地址ea,段地址sa默认在ds中,将sa:ea处的数据送入ax中
即(ax)=((ds)*16+(bx)):
loop指令的格式:loop标号,cpu执行loop指令的时候,要进行两步操作:
(1)(cx)=(cx)-1
(2)判断cx中的值,不为0则转至标号处执行程序,如果为0则向下执行。
(cx存放循环次数)
标号:标号代表一个地址,此程序中有一个标号s。它实际上标识了一给标号s
在汇编程序中,数据不能以字母开头,所以要在前面加0。
5.3在debug中跟踪用loop指令实现的循环程序
G命令和p命令来解决
总结:
【bx】作用:作为偏移地址与ds配合
loop和cx合作(循环)
debug的——g偏移地址命令和-p命令(跟踪)
5.4debug和汇编编译器masm对指令的不同处理
5.5loop和【bx】的联合应用
类型的匹配和结果的不越界:
具体来说,就是在做加法的时候,我们有两种方法:
(dx)=(dx)+内容中的八位数据(两运算对象的类型不匹配)
(dl)=(dl)+内容中的8位数据;(结果可能超节)
解决
目前方法:就是我们得用一个16位寄存器来做中介
表示内存单元偏移地址的x应该是一个变量,因为在循环过程中,偏移地址必须能够递增。
5.6段前缀
指令mov ax,【bx】中,内存单元的偏移地址由于bx给出,而段地址默认在ds中。
我们可以在访问内存单元的指令中显示地给出内存单元的段地址所在的段寄存器。
这些出现在访问内存单元的指令中,用于显示的指明内存单元的段地址“ds”,“cs”,“ss”或“es”,在汇编语言中称为段前缀