实验2 汇编源程序编写与汇编、调试
实验结论:
- 实验任务1
源代码:
;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
汇编、链接、运行调试操作:


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

查看PSP的命令及截图:

使用g命令执行到line16退出执行之前,操作截图:

该实验单步调试不能显示符号,但最后运行可以显示,可能是单步调试出现了屏幕刷新数据覆盖的问题。

- 实验任务2
源代码:
; 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工具汇编、链接的命令行及运行结果截图:


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

使用t命令执行到结束之前,对ex2.exe进行调试的截图:

修改CX后使用g命令执行到结束之前,对ex2.exe进行调试的截图:


该实验与实验任务一出现相同的问题。
ex1.asm和ex2.asm实现相同的功能,但是实验一将所有的指令都写出来进行赋值,而实验二是利用loop循环来实现,相较而言实验二的方法更方便。
- 实验任务3
源代码:
;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
运行结果:

0239h运行结果:

0437h运行结果:

据结果猜测,高位字节里存放的是数值信息,低位字节里存放的是显示颜色信息。
- 实验任务4
源代码:
; 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 bx, 1h
add ax, 1h
loop s
mov ah, 4ch
int 21h
code ends
end
用d命令查看0:200~0:23F:

- 实验任务5
源代码:
; ex5.asm
assume cs:code
code segment
mov ax, cs
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, 17h
s: mov al, ds:[bx]
mov es: [bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
首先要给ax赋值时是确定复制开始的位置,根据分析,开始是选择当前要读取指令的地址,且为段地址,即选择cs;
然后第二空确定多少个字节时先随便给cx赋值,然后进行编译、连接、调试反汇编后确定准确需要复制的字节数。


查看复制前相关内存数据信息:


查看复制后的内存数据信息:


可见已经复制成功。
实验总结:
- 通过本次实验我具体掌握了汇编语言源程序编写、汇编、链接、调试的工具和方法。
- 我更加深刻地认识到[bx]间接寻址正确用法和loop循环指令带来的方便之处。
- 我再一次熟悉了段地址和偏移地址的灵活运用。
- 学会了如何将汇编源程序存储为外部文件的时候,对内存地址单元的数据存放在寄存器中而不是将地址存放。
- 学会了如何将指定的指令复制到内存中去
- 新发现了实验中单步调试不能显示符号,但最后运行可以显示,是因为屏幕刷新数据覆盖的问题。
浙公网安备 33010602011771号