首页 > 其他 > 详细

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

时间:2020-11-06 00:16:07      阅读:28      评论:0      收藏:0      [点我收藏+]

实验任务1

给出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

给出使用masm、link工具汇编、链接的命令行及运行结果截图

技术分享图片

给出debug运行截图

  • 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
  • 查看PSP的命令及截图
  • 使用g命令执行到line16退出执行之前,操作截图
    技术分享图片

实验任务2

给出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

给出使用masm、link工具汇编、链接的命令行及运行结果截图

技术分享图片

给出使用debug调试的截图

  • 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
    技术分享图片

  • 灵活使用t命令/p命令、g命令,对ex2.exe进行调试的截图(不一定要单步,有些地方可以
    用g命令,一次执行多行汇编指令)
    技术分享图片

结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?

  • 效果上,实现了相同的功能,产生了三个小图标
  • 原理上,都是通过修改内存中对应的地址改变显示的内容
  • 实现上,实验一手动对对应内存进行修改,试验二则使用循环进行,分别改成0101H,0202H,0303H,和试验一中一致

发现在debug时使用d指令查看对应内存单元时并没有发生改变,且小图标也没有出现,可能是因为被刷新掉了

实验任务3

综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H,给出源代码

;综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H
assume cs:code
code segment
    mov ax,0b800h
    mov ds,ax

    mov bx,07b8H
    mov ax,3902H
    mov cx,16
s:  mov [bx],ax
    add bx,2
    loop s

    mov ah,4ch
    int 21h
code ends
end

给出运行结果截图

技术分享图片

基于以下实验操作的发现和文字说明

  • 把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
    技术分享图片
  • 把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
    技术分享图片
  • 猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
    - 39变成39,图案发生变化,低位控制图案,测试发现为ascii码
    - 02变成04,颜色发生变化,高位控制颜色

实验任务4

实现向内存0:200~0:23F依次传送数据0~63(3FH),综合使用[bx]和loop,编写汇编源程序

;实现向内存0:200~0:23F依次传送数据0~63(3FH),综合使用[bx]和loop,编写汇编源程序
assume cs:code
code segment
    mov ax,0020h
    mov ds,ax

    mov bx,0
    mov cx,64
s:  mov [bx],bl
    add bx,1
    loop s

    mov ah,4ch
    int 21h
code ends
end

灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。

技术分享图片

利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序。

;利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过的指令实现)
assume cs:code
code segment
    mov ax,0020h
    mov ss,ax
    mov ax,0040h
    mov sp,ax

    mov bx,3f3eh
    mov cx,32
s:  push bx
    add bx,-0202h
    loop s

    mov ah,4ch
    int 21h
code ends
end

灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。

技术分享图片

实验任务5

下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。

assume cs:code
code segment
    mov ax,code
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,18h
s:  mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end

汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200之后的若干字节,观察是否将mov ax, 4c00h之前的指令复制到指定内存,这部分要求有截图,并以文字方式说明空白处填写依据。

技术分享图片

  • 关于第一空,因为要复制当前代码的数据,结合上下文,ax要得到代码开始的段地址,所以填入code
  • 关于第二空,cs显然是循环变量,每次复制一个byte,所以计算程序的总byte数为18h,所以填入18h

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

原文:https://www.cnblogs.com/sanshuiii/p/13933769.html

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