实验2 汇编源程序编写与汇编、调试
- 2020 年 11 月 2 日
- 筆記
;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

debug调试:
• d命令查看程序段前缀PSP所占的256个字节。
• u命令反汇编
• g命令执行到程序退出执行之前
;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

dubug调试:
单步调试循环指令loop:
单步调试中断指令int:
到loop、int时直接用P命令:
经观察发现,t命令单步执行,每次只执行一条代码语句,遇到子程序后进入子程序逐条执行指令。p命令,类似t命令。若有子程序,直接执行完子程序全部指令而不是逐条执行指令,在遇到循环指令loop时,会直接执行志cx递减至0。
ex2.asm中line9为mov cx, 4时:
改成 mov cx, 8 ,保存后重新汇编、链接、运行:
ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同
通过上述实验可知,他们实现的功能和效果相同,都完成了图案的输出。
具体实现上,ex1.asm使用了byte ptr的形式直接填入了8个数,而ex2.asm使用了loop循环将值存入显存。
(1)填充数据0237H
;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,4ch int 21h code ends end
(2)填充数据0239H
(3)填充数据0437H
观察后猜想:高位字节存放的是颜色信息,低位字节是内容信息。
必做:
; ex4.asm assume cs:code code segment mov ax, 0h mov ds, ax mov bx, 200h mov al, 0h mov cx, 40H s: mov [bx], ax add bx, 1 add ax, 1 loop s mov ah, 4ch int 21h code ends end
调试并用d命令查看数据是否存入此段内存区域:
选做:
8086的入栈操作是从高地址向低地址,所以设置栈的段地址ss为0h,设置sp为0240h。又因8086入栈操作只能以字为单元。所以ax初始为3F3Eh,小端法栈里添加。
;ex44.asm assume cs:code code segment mov ax,0h mov ss,ax mov ax,0240h mov sp,ax mov ax,3F3Eh mov cx,20h s: push ax add ax,-0202h loop s mov ah,4ch int 21h code ends end
调试并用d命令查看数据是否存入此段内存区域:
在确定复制多少字节时,可以先随意补全,用u命令精准反汇编,找到mov ax, 4c00h。来确定要复制的字节数。
反汇编后可知 mov ax,4c00 命令位于0018h。所以要复制0-0017h所有字节,因此将0017复制给cx。由寄存器cs知要复制的代码位于076A段,所以将076A赋值给AX。
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
运行结果:
汇编语言调试完毕后,反汇编查看内存单元 0:200-0:217处。发现复制成功。