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

任务1:

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

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

使用debug调试的截图:

使用r命令查看寄存器cx的值:

使用d命令查看PSP所占的256个字节:

使用u命令精准反汇编:

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

任务2:

ex2.asm源代码:

; ex2.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov bx, 0
mov ax, 101H
mov cx, 8
s: mov [bx], ax
add bx, 2
add ax, 101H
loop s
mov ah, 4ch
int 21h
code ends
end

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

使用debug调试的截图:

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

使用t命令/p命令、g命令,对ex2.exe进行调试的截图:

对于loop指令,使用t命令单步调试

对于loop指令,使用p命令调试

对于中断指令int,使用t命令单步调试

对于中断指令int,使用p命令调试

改动ex2重新汇编、链接、运行并观察结果

对比ex2.asm和ex1.asm,它们实现的是相同的功能和效果,只不过ex1是一个个填入数据,ex2使用loop指令循环写入,节省了代码长度。

任务3:

给出ex3源代码:

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

mov dx,0437h

mov cx,16

s:mov [bx],dl
inc bx
mov [bx],dh
inc bx
loop s

mov ax,4c00h
int 21h

code ends
end

给出运行结果截图:

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果:

把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果:

猜测:高位字节存放颜色信息,低位字节存放字符类型信息

任务4:

程序源代码:

;ex4.asm
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,0200h

mov dx,0

mov cx,0040h

s:mov [bx],dl
inc dx
inc bx
loop s

mov ax,4c00h
int 21h

code ends
end

汇编、链接无误后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200~0:23F:

使用u命令精准反汇编:

使用d命令查看是否正确写入:

采用栈方式的源程序:

;ex4.asm
assume cs:code
code segment
mov ax,0
mov ss,ax
mov sp,0240h

mov dx,3f00h

mov cx,0040h

s:push dx
dec dh
inc sp
loop s

mov ax,4c00h
int 21h

code ends
end

汇编、链接无误后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200~0:23F:

使用u命令精准反汇编:

使用d命令查看是否正确写入:

任务5:

填空以后的源代码:

;ex4.asm
assume cs:code
code segment
mov ax,cs
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

汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200之后的若干字节,
观察是否将mov ax, 4c00h之前的指令复制到指定内存:

使用u命令精准反汇编:

使用u命令反汇编查看复制后的代码:

使用d命令查看复制后的字节:

首先ax送给ds寄存器,表明是传送的代码段的字节位置,所以第一个空填入cs寄存器的值,表明将代码段的段地址作为将要被复制的数据的段地址。

第二空先任意填入一个数字,使用debug命令查看当前代码所占用的字节长度,截取到mov ax,4c00h之前的长度,即17填入第二空。

实验总结:

(1)能够熟练掌握出使用masm、link工具汇编、链接的命令行并查看运行结果的方法。

(2)了解了程序段前缀的查看方法和存储细节。

(3)了解t命令 p命令和g命令的使用区别。t命令是单步调试,p命令是遇到loop指令执行到loop指令结束的位置,g命令是执行到指定的行位置。

(4)使用loop指令可以提高开发效率节约代码长度。

(5)填充字段输出显示在显示屏上时,高位字节可能存放颜色信息,低位字节可能存放字符信息。

(6)利用栈段填充信息时注意栈传送的单位是字而不是字节,并且是从高地址开始向低地址运行,而且栈顶的初始化注意指向的是栈外。

(7)将代码段复制和将字节数据复制原理相同,只不过复制的段地址是cs寄存器中的值,并且要根据复制的代码段所占的字节数设置cx寄存器的值。

posted @ 2020-10-31 12:47  knight04  阅读(191)  评论(3)    收藏  举报
Live2D