实验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
(1)使用masm、link工具汇编、链接的命令行及运行结果截图
(2)查看PSP的命令截图
(3)结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
(4)用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
(1)使用masm、link工具汇编、链接的命令行及运行结果截图
(2)结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
(3)灵活使用t命令/p命令、g命令,对ex2.exe进行调试的截图
<1>用G命令调试到出现循环的位置,然后用P命令执行循环内容,再用T命令去进行单步调试,当再次遇到INT 21时,用P命令退出本次调试
<2>用G命令调试到出现循环的位置,然后用T命令进行单步调试
(4)把ex2.asm中line9 mov cx, 4改成mov cx, 8,保存后重新汇编、链接、运行并观察结果
回答问题:结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
分析:
三次图案的不同应该是由于循环的次数不同,mov cx,4所表示的意思是将循环进行4次,mov cx,8是将循环进行8次。
其中,ex1.asm使用mov直接赋值,ex2.asm使用loop循环对其赋值。
3. 实验任务3
给出源代码
mov ax,0b800h
mov ds,ax
mov bx,07b8h
mov ax,0437H
mov cx,16
s: mov [bx],ax
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end
(1)结果截图。
(2)把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
(3)把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
回答问题:猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
分析:
从0237改成0239:颜色均为绿色,数字由7变为9。
从0237改成0437:颜色由绿色变红色,数字均为7。
由此看出,改变高位字节可以改变颜色,改变低位字节可以改变内容。
4. 实验任务4
(1)编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
code segment
mov ax,20h
mov ds,ax
mov cx,40h
mov bx,00h
s: mov [bx],bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
(2)灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。
分析:由此可见0~3F已传送至此段内存区域。
5. 实验任务5
填空以后的源代码
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,17h
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
mov ax,4c00前共有10行代码,先设置cx为31即1fh,再根据debug中反汇编后查看mov ax,4c00代码的地址,修改cx的值
根据上图,将cx改为17h后再汇编、链接、运行、debug
分析用:D命令查看,发现已经复制到指定内存