首页 > 其他 > 详细

实验2 汇编源程序编写与汇编、调试

时间:2020-11-03 19:15:52      阅读:22      评论:0      收藏:0      [点我收藏+]

一、实验目的
1. 理解并掌握汇编源程序组成与结构 2. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法 3. 理解汇编源程序中地址表示、段寄存器的用法 4. 理解和掌握寄存器间接寻址方式[bx] 5. 通过汇编指令loop的使用理解编程语言中循环的本质
  二、实验准备
1. 学习/复习第5章使用[bx]和loop实现循环的编程应用示例(教材5.5节,5.8节) 2. 复习第3章「栈」的知识 3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法 4. 复习8086汇编中内存单元地址的表示,以及段寄存器DS, SS, ES, CS的用途
三、实验内容
1. 实验任务1
使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:

;ex1.asm
assume cs:code
code segment
    mov ax,0b810h
    mov ds,ax

    mov byte ptr ds:[0],1
    mov byte ptr ds:[1],1
    mov byte ptr ds:[2],2
    mov byte ptr ds:[3],2
    mov byte ptr ds:[4],3
    mov byte ptr ds:[5],3
    mov byte ptr ds:[6],4
    mov byte ptr ds:[7],4

    mov ah,4ch
    int 21h
code ends
end
要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行,使用debug工具调试可执行文件。
  ? 使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。
  ? 使用debug工具对程序进行调试
    ? 使用debug加载可执行文件ex1.exe后使用d命令查看程序段前缀PSP所占的256个字   节。
    ? 结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
    ? 使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。
(1)使用masm、link对ex1.asm进行汇编、链接
技术分享图片技术分享图片
(2)d命令查看程序段前缀PSP所占的256个字节:程序的物理地址为SA*16+0+256=SA*16+16*16+0=(SA+16)*16+0,由这段可知段地址和偏移地址表示的为:SA+10H:0,所以PSP地址为CS-10H:IP。
技术分享图片
使用u命令对ex1.exe进行精确反汇编(应为CX中值为0031),所以此时反汇编的内存单元从76A:0-76A:30
技术分享图片
(3)g命令执行到程序退出执行之前
技术分享图片
2. 实验任务2
使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:
;ex2.asm
assume cs:code
code segment
    mov ax,0b810h
    mov ds,ax

    mov bx,0
    mov ax,101H
    mov cx,4
s:    mov [bx],ax
    add bx,2
    add ax,101H
    loop s
    mov ah,4ch
    int 21h
code ends
end
要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,使用debug工具调试可执行文件。
  ? 使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。
  ? 使用debug工具对程序进行调试。
    ? 结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编
    ? 灵活使用t命令、p命令、g命令,对ex2.exe进行调试。(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)
    ? 注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。
  ? 把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。
  ? 结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同
(1)使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。技术分享图片
(2)使用debug工具对程序进行调试。
T命令单步执行(包括循环内内容),
技术分享图片
技术分享图片
技术分享图片技术分享图片技术分享图片
g命令(执行到指定位置)
技术分享图片
p命令(单步执行,循环内内容不单步执行)
技术分享图片技术分享图片技术分享图片
(2)把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。技术分享图片

把4改成8 看结果AX由0101+8*0101 = 0909 BX为0+2*8=0010 即以下代码循环8次 cx是计数器寄存器,存放循环次数。

s:     mov [bx], ax

       add bx, 2

       add ax, 101H

       loop s    

3. 实验任务3

综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。
要求:
  ? 编写汇编源程序、给出运行结果截图。
  ? 把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
  ? 把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
(1)编写汇编源程序、给出运行结果截图。

(实验中的问题,仿照ex1,ex2 bx的值仍然设成0,这是愚蠢的,向内存加入字数据内容,字数据占16字节)故 bx需要自加两次)

; ex3.asm
assume cs:code
code segment
    mov ax, 0b800h
    mov ds, ax
    
    mov ax, 0237h
    mov bx,07b8h
    mov cx, 16
s:    mov [bx],ax
    inc bx
    inc bx
    loop s
    mov ah, 4ch
    int 21h
code ends
end

技术分享图片

(2)把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。

技术分享图片

(3)把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。技术分享图片

猜想:高位字节存颜色信息,低位字节存放相应的内容。

4.实验任务4
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
? 必做
  ? 综合使用[bx]和loop,编写汇编源程序
  ? 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。
;ex4.asm
assume cs:code
code segment
    mov ax,0020h
    mov ds,ax
    mov bx,0
    mov cx,64
s:  mov [bx],bl
    inc bx
    loop s
    mov ah,4ch
    int 21h
code ends
End

(1)汇编和链接技术分享图片

(2)反汇编

技术分享图片

(3)综合使用t,p,g命令

技术分享图片

(4)观察结果

技术分享图片

5. 实验任务5
教材实验4(3)(P121)

CS中存放的是程序存放的段地址,将cs寄存器中的段地址赋值给ax,再通过ax赋值给ds段寄存器。

;ex5.asm
assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,17h
  s:mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    mov ah,4ch
    int 21h
code ends
end

技术分享图片

CX存储整个程序代码所占字节数,要求复制mov ax,4c00h之前的指令,故CX寄存器赋值为17h

 

 

 

实验2 汇编源程序编写与汇编、调试

原文:https://www.cnblogs.com/lsl722/p/13921409.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!