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)首先编写ex1.asm:

 

(2)对ex1.asm用masm工具进行汇编:

 

生成ex1.obj:

 (3)再对生成的ex1.obj用link工具进行连接:

生成ex1.exe:

 

(4)直接运行ex1.exe:

 

 

 发现并没有任何内容输出

(5)使用debug工具对程序进行调试:

1)使用d命令查看程序段前缀PSP所占的256个字节:

 

 

 2)结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编:

 

 

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

 

 

 

 

 

 

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进行调试。

把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。

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

(1)对ex2.asm进行汇编、链接、运行:

运行ex2.exe也无任何输出

(2)使用debug工具对程序进行调试:

1)结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编:

 

 

 

 2)灵活使用t命令、p命令、g命令,对ex2.exe进行调试:

 

 

 

 

 

 3)把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果:

 

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

答:两者实现了相同的效果,但在功能上有所差别。ex1.asm是直接将数据存入内存里,而ex2.asm是通过loop指令对一些大致相同且有规律可循的指令进行循环,从而缩短了代码。

 

3. 实验任务3

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

要求:

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

编写代码:

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

        mov bx,7b8H
        mov ax,0237H
        mov cx,10H
s:      mov [bx],ax
        add bx,2
        loop s

        mov ah,4ch
        int 21h
code ends
end

运行结果:

 

改成0239H后的运行结果:

 

 

 

 改成0437H后的运行结果:

 

 

 

 

    猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。

答:高字节存放的是文字的颜色信息,低字节存放的是内容文字信息。

 

4. 实验任务4

编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。

编写代码:

;ex4.asm
assume cs:code
code segment
    mov ax,0h
    mov ds,ax
    mov bx,0200h
    
    mov dx,0h    ;0~63(3fh)
    mov cx,40h
s:    mov ds:[bx],dl
    inc dx
    inc bx
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end

对ex4.asm进行汇编、连接:

 

先使用u命令对ex4.exe进行精确反汇编: 

 

 先使用g命令调试,然后在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域:

 

 

 

5. 实验任务5

将“mov ax,4c00h"之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果:

补全代码:

;ex5.asm
assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,23
s:  mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00h
    int 21h
code ends
end

对ex5.asm进行汇编、连接:

 

用r命令查看内存,并用u命令进行反汇编:

 

 使用g命令调试程序,然后用d命令查看0:200到217的字节,再用u命令反汇编:

 

 

 由上图发现代码成功复制!

 

总结:

1.汇编和连接可以先输入masm/link,再在后面输入对象的文件名,也可以以简化的方式进行,比如:masm ex1.asm;

2.ex1.exe与ex2.exe直接运行后并没输出结果,这是因为它们程序本身就不输出任何东西,只有里面的内存数据变了而已;

3.在遇到大量相似且有规律可循的代码,我们可以用loop指令去简化代码。

 

posted on 2020-11-04 20:17  cox4869  阅读(161)  评论(3)    收藏  举报