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

四、实验结论
1. 实验任务1

此部分书写内容:

  • 给出ex1.asm源代码
  • 给出使用masm、link工具汇编、链接的命令行及运行结果截图
  • 给出使用debug调试的截图

  包括:

  1. 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
  2. 查看PSP的命令及截图
  3. 使用g命令执行到line16退出执行之前,操作截图
结论:
        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

使用masmlink工具汇编、链接的命令行及运行结果截图:

 使用debug调试:

 查看PSP的命令及截图:

 使用g命令执行到line16退出执行之前

2. 实验任务2

此部分书写内容:

  • 给出ex2.asm源代码
  • 给出使用masm、link工具汇编、链接的命令行及运行结果截图
  • 给出使用debug调试的截图

  包括:

  1. 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
  2. 灵活使用t命令、p命令、g命令,对ex2.exe进行调试的截图(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)
  3. 把ex2.asm中line9  mov cx, 4 改成  mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。
  4. 结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?

结论:

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

使用masmlink工具汇编、链接的命令行及运行结果截图:

  使用debug调试:

 t、p、g命令调试:

 

 

 把cx改为8并重复之前步骤:

对比ex2.asmex1.asm

二者本质上都是通过往显存空间写入数据使之在屏幕上呈图形。区别在于处理方式,一种是循环写入,一种是直接写入。

3. 实验任务3

此部分书写内容:

  • 给出源代码
  • 给出运行结果截图
  • 基于以下实验操作的发现和文字说明

  包括:

  1. 把填充的字数据,从0237H改成0239H,再次保存后,汇编、链接、运行,观察结果。
  2. 把填充的字数据,从0237H改成0437H,再次保存后,汇编、链接、运行,观察结果。
  3. 猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。

 结论:

程序源码:

 

assume cs:code
code segment

    mov ax,0b800h
    mov ds,ax
    mov bx,07b8h
    mov cx,16
s:     mov dx, word ptr 0237h
    mov ds:[bx],dx
    add bx,2
    loop s

    mov ax,4c00h
    int 21h

code ends
end

 运行结果:

 0237H改成0239H

 0237H改成0437H

分析:高位02代表输出字符颜色为绿色,高位04代表输出字符颜色为红色;低位37代表数字字符“7”,低位39代表数字字符“9”;

综上:高位控制输出颜色,低位控制输出内容。

4. 实验任务4

此部分书写内容:

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

 

结论:

  程序源代码:

assume cs:code
code segment

    mov ax,0200h
    mov ds,ax
    mov cx,64
s:    mov [bx],bx
    inc bx
    loop s

    mov ax,4c00h
    int 21h

code ends
end

 t、p、g命令调试

 

 

 

 d命令查看0:200~0:23F:

5. 实验任务5

此部分书写内容:

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

结论:

    程序代码:

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

调试查看:

分析:

 本题要点在于分析好需要赋值的代码区间,通过反汇编可知复制部分长度比代码段总长度少5字节,故第二处填写 sub cx,5 。

 

6.实验任务6(选做*)

在linux环境下,编写、汇编、运行、调试一个32位Intel风格的x86汇编程序。

第1步,使用vim或其他文本编辑器,编写一个32位Intel风格的x86汇编程序example.asm。

  程序代码:

;example.asm

global _start

section .data
    msg db "a simple test",0xa
    len equ $ - msg

section .test
_start:
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,len
    int 0x80    ;调用linux下的int 0x80中断的4号子功能,输出字符串

    mov eax,1
    mov ebx,0
    int 0x80    ;调用linux下的int 0x80中断的1号子功能,退出

用vi编辑器编写程序后查看example.asm的内容:

 

第2步,使用nasm,对example.asm进行汇编。

 汇编后用ls命令查看,生成example.o文件:

第3步,使用Id,对example.o进行链接。

链接后用ls命令查看,生成可执行文件example

第4步,执行可执行文件example。

./example执行可执行文件:

 执行后,在shell命令终端查看返回值:

显示返回值0,对应源码文件中line18寄存器ebx的值。

把example.asm中line18行中寄存器ebx的值7:

 

 重新汇编、链接、运行:

 

 再次使用 echo $? 查看返回值:

五、实验总结

(1)实际操作过程中发现自己笔记本上使用debug时无法执行p命令,经老师建议改用了debug32程序进行debug

(2)加深了对loop循环的理解和cpu执行汇编程序时的各个过程,学会了利用debug工具调试程序。

 

 

posted @ 2020-11-03 23:59  Mayenne-白姬  阅读(213)  评论(1编辑  收藏  举报