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

四、实验结论

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

进入edit:

使用masm、link工具汇编、链接的命令行及运行结果:

link:对生成的目标文件ex1.obj进行和库的连接,生成可执行文件

 

使用debug调试:

 

 

CX的值为0031H,使用u命令反汇编:

 

 使用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

edit模式中:

 

 使用masm、link工具汇编、链接的命令行及运行结果:

 

 

 

 使用debug调试,CX的值为001CH,使用u命令反汇编:

 

 使用t命令单步执行,直到loop时用p命令:

 

 

 

执行程序后可以看见右上角图片:

 

 当将程序中mov cx,4改为 mov cx, 8 ,保存后重新汇编、链接、运行,可以看见右上角图片发生改变:

 

Q:ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?

A:可以得出它们所实现的功能和效果是相同的,都完成了图案的输出。

具体实现上,ex1.asm使用了byte ptr的形式直接填入了8个数,而ex2.asm使用了loop循环将值在相同的内存地址中存入数据。

3. 实验任务3

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

要求:

  • 编写汇编源程序、给出运行结果截图。
  • 把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
  • 把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
 
源代码:
;ex2.asm
assume cs:code
code segment
    mov ax, 0b800h
    mov ds, ax
    mov bx, 07b8h
    mov ax, 0237H
    mov cx, 10h
s:    mov [bx], ax
    add bx, 2
    loop s
    mov ah, 4c00h
    int 21h

code ends
end

运行结果:

 

 

更改一:填充字数据0239H:

 

 运行结果:

 

 更改二:填充字数据0437H:

 

 

运行结果:

 

 得出猜想:高位字节里存放的是颜色信息,低位字节里存放的是内容信息。

4. 实验任务4

编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
♦ 必做
  • 综合使用[bx]和loop,编写汇编源程序
  • 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。
♦ 选做*
  • 利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序
  • 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。
♦ Tips:
这道练习,本质上就是把一组连续的字节数据(常数),送到指定的连续的字节单元。
如果利用栈实现,借助push和loop实现连续入栈操作。需要注意:
① 初始时ss和sp的设置
② 8086的入栈操作,是从高地址单元→低地址单元方向的;
③ 8086的入栈操作,只能以字为单元。但这里是字节数据,如何灵活处理?
 
; ex4.asm 
assume cs:code 
code segment 
    mov ax, 0000H
    mov ds, ax 
mov al, 0000h mov bx, 0200h mov cx, 0040h s: mov [bx], ax
    add bx, 1
    add ax, 1
    loop s 
mov ax,4c00h
int 21h
code ends
end

 

 

 

 

 

 

 

5. 实验任务5

教材实验4(3)(P121) 

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

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

因为17H-0=23

 

 

 

用t命令单步执行:

 

 

 

 

 用d命令查看0:200之后的字节:

 

 

 观察到已复制到指定内存

可得:
1.cs指令指向反汇编的命令,所以应该填cs。
2.IP=IP+所读指令的字节数,u命令反汇编发现,mov ax 4c00h位于0017h,0017h-0=17h=23,得到23。
 

五、实验总结

1.掌握了根据CX精确反汇编。

2.了解了填充字段到内存中,高位字段存放字颜色,低位字段存放字内容。

3.了解了loop循环可以用于简化任务,节省代码量,可用p命令进行一步完成。

部分问题:

4.实验一与实验二的那些图标有时不能保证完全显示,且在单步调试时通常未显示。

posted @ 2020-11-06 08:32  浔川Dawn  阅读(209)  评论(2)    收藏  举报