实验3 编程、编译、连接、跟踪

 

预备知识:

一个汇编语言程序从写出到执行的简要过程:

一:编写汇编源程序;

二:对源程序进行编译连接;可执行文件包含两部分内容:1.程序(指令机械码)和数据(程序定义的数据)、2.相关信息描述

三:执行可执行文件中的程序

课本P94:

(1) 将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe。

assume cs:codesg  

codesg segment  

        mov ax,2000H  

        mov ss,ax  

        mov sp,0  

        add sp,10  

        pop ax  

        pop bx  

        push ax  

        push bx  

        pop ax  

        pop bx  

        mov ax, 4c00h  

        int 21H  

codesg ends  

end

 

 

(2) 用DEBUG跟踪t1.exe的执行过程,写出第一步执行后,相关寄存器的内容和栈顶内容。

 

 前四条指令只用了三次t命令,初始化栈地址为:SSSP=200010

使用栈操作命令先是把栈中数据段(20000~E)的内容放置到ax01A3,bx0000)中再使用Push命令堆回去,使得栈中偏移地址为0~ E数据内容颠倒,再使用Pop命令导出到ax,bx中可见,ax=0000H,bx=01A3H

(3)PSP的头两个字节是CD 20,用DEBUG加载t1.exe,查看PSP的内容。

 

PSP和物理地址连续,然而,却有不同的地址!

实验内容;

1. 练习 1

1 步,编写汇编源程序 t1.asm, 源程序代码如图 1-1 所示。

 

1-1 汇编源程序 t1.asm 源代码

2 步,对源程序 t1.asm 进行汇编、连接、运行、调试

(1) 运行程序,观察程序输出结果是什么?

masm集成环境中写入代码:

 

运行结果:

 

Dos窗口左上方出现36数字,疑似与dl数据段有关。

(2)  line4  line9 种寄存器 dl 的值分别修改为 0~9 中任何一个数字,重新汇编连接→运行,观察结果的变化。

分别进行修改成5和9,得执行结果如图:

 

这次dos窗口左上方出现了数字59,由两次执行结果易知5对应第一次int 21H之前得dl数据5,9对应第二次int 21H 之前得dl数据内容9。

(3)  debug 对生成的可执行文件 t1.exe 进行调试。

① 使用命令查看。观察寄存器 cx 的值是 多少;观察寄存器 ds  cs 的值是多少,它们之间是否满足关系(cs)=(ds)+10H?

 

由图可知:CX =0016H,CS=076AH,ds=075AH,满足(cs)=(ds)+10H;

② PSP(程序段前缀)的头两个字节是 CD 20, debug 查看 PSP 的内容,验证是否如此。 

如图:

 

 

③ 使用 u 命令对 t1.exe 进行反汇编,观察反汇编得到的源代码。

 

④ 使用 t 命令和 p 命令(遇到 int 命令时,用 p 命令)单步调试,观察结果。

单步调试如图:

观察到每遇到一次int 21H, 在执行命令P下方即出现dl所对应得数值。

2. 练习 2

1 步,编写汇编源程序 t2.asm,源程序代码如图 1-2 所示。

 

*

1-2 汇编源程序 t2.asm 源代码

line6-7 相当于 mov [0],0433h line9-10 相当于 mov [2], 0436h

至于为什么这样使用两条指令,而不直接简化写成上面的形式,有两个原因。其中一个是方便以后循环;另一个原因,留待第 5 章再解释说明。暂时,先这样使用。

 

2 步,对源程序 t2.asm 进行汇编、连接、运行、调试

(1)  t2.asm 进行汇编、连接后,得到可执行文件 t2.exe。运行 t2.exe,观察程序运行结果,验证是否在屏幕左上方出现红色的数值 36

*经测试,有些平台在 dosbox 下运行这个程序时有些问题,如果屏幕左上方没有输出结果,请运行程序 t2.exe 前,先输入 cls 命令清空一下屏幕,然后再执行 t2.exe

程序运行出现错误,如图:

 

修改成mov [0],0433h mov [2] ,0436h 亦生错误

 

然而,使用debug编译连接,无错误发生:

 

产生文件如下:

 

Debug中运行得结果:

 

在左上角出现红色数字36

(2) 如果(1)结果得到验证,重新打开 t2.asm,尝试将源代码中 line7  0433h→0432h,

line10 0436h→0439h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清屏后,再次观察程序运行结果。

用记事本对其进行更改:

 

修改后需重新编译连接:

 

执行:

 

左上方出现红色数字29

(3) 如果(1)结果得到验证,重新打开 t2.asm,尝试将源代码中 line7  0433h→0333h,

line10 0436h→0336h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清屏后,再次观察程序运行结果。

同(2)再次进行修改-编译-连接,得执行结果如图:

 

由(1)(2)不难得知,显示出的数字与数据段中末尾值相关,而如今修改了前三位数值后,数字颜色发生变化,由043变化至033,颜色由红变天蓝色。

总结:综上可知,int 21H似乎与屏幕显示有关,根据ax,bx所指向啊不同,进行不同的输出,int interupt 中断的缩写,int 21H是指dos的中断调用命令。根据目前所学,至ax=4C00h,再调用int 21H,程序结束,而有实验可知ax=2时,调用int 21h会使字符输出。

关于练习2使用masm集成实验环境运行t2时,为何出错,出现mov [bx],0433h指令无效的错误,]本人不知所以,如有所知,期待有所解答。

posted @ 2018-10-28 12:10  但愿人长久的路小周  阅读(903)  评论(3编辑  收藏  举报