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

四、实验结论

1. 实验任务1

此部分书写内容:
  • 给出ex1.asm源代码
  • 给出使用masm、link工具汇编、链接的命令行及运行结果截图
  • 给出使用debug调试的截图
     包括:
    • 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
    • 查看PSP的命令及截图
    • 使用g命令执行到line16退出执行之前,操作截图

源代码:

;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命令执行程序到退出之前:

 

2. 实验任务2

此部分书写内容:
  • 给出ex2.asm源代码
  • 给出使用masm、link工具汇编、链接的命令行及运行结果截图
  • 给出使用debug调试的截图
     包括:
    • 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
    • 灵活使用t命令/p命令、g命令,对ex2.exe进行调试的截图(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)
  • 回答问题
    • 结合上述实验和观察,分析、对比ex2.asm和ex1.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

进行汇编、链接,直接运行:

如图可见,运行后出现图案。

使用debug调试程序:

使用u命令进行反汇编:

 使用t、p、g命令进行调试:

使用g命令执行到循环跳转前,使用t命令单步执行一轮循环,再使用p命令执行完循环,最后执行完程序

对于循环指令loop和中断指令int,t命令只执行一行指令,p命令会一次完成整个循环或中断。

将ex2.asm中line9 mov cx, 4 改成 mov cx, 8,重新进行编译链接运行,得到结果是:

如图可见,由于向cx寄存器中存入数据由4改为8,故循环次数由4次变为8次,故出现8个图形。

问题回答:

ex2.asm与ex1.asm功能与效果相同,本质上都是向显存空间地址写入数据使屏幕上出现图案;在具体实现上ex1.asm是直接挨个存入数据,ex2.asm是使用循环,累加地址和数据,从而挨个存入数据。

 

3. 实验任务3

此部分书写内容:
  • 给出源代码
  • 给出运行结果截图
  • 基于以下实验操作的发现和文字说明。
    • 把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
    • 把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
    • 猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。 

源代码:

;ex3.asm
assume cs:code
code segment
    mov ax, 0b800h
    mov ds, ax

    mov bx, 07b8h
    mov ax, 0237h
    mov cx, 16
s:    mov [bx], ax
    add bx, 2
    loop s

    mov ah, 4ch
    int 21h
code ends
end

编译、链接:

运行结果:

将0237H改为0239H后,运行结果为:

 将0237H改成0437H后,运行:

根据结果分析可知字数据中高位字节存放的是颜色信息,低位字节存放的内容数据。

 

4. 实验任务4

此部分书写内容:
  • 程序源代码
  • 汇编、链接无误后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200~0:23F,确认是否将0~63传送至此段内存区域。这部分,要求有截图

源代码:

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

    mov bx, 200h
    mov ax, 0
    mov cx, 64
s:    mov [bx], ax
    add ax, 1
    add bx, 1
    loop s

    mov ah, 4ch
    int 21h
code ends
end

debug,使用g、t、p命令调试:

d命令查看:

 确认将0~3F传送至此段内存区域

 

5. 实验任务5

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

源代码:

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

汇编连接后,进行调试:

执行后查看:

成功复制。

第一处空白处填写cs,ax寄存器内值将送往ds,由于后面从[bx]送到al,即ds:[bx],故ds得是当前指令的段,故填cs。

第二处空白处填写17h,在任意填写编译链接运行后可发现,到mov ax,4c00h指令前的地址到0017,而cx为循环次数故为17。

posted @ 2020-11-05 00:02  尜尜牧  阅读(89)  评论(2)    收藏  举报