汇编语言实验三
实验任务1
编译运行:
问题回答:
① line27, 汇编指令loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。
机器码是E2F2,E2表示loop,F2表示位移量的补码
位移量的原码是10001110 = -14 就是位移量
② line44,汇编指令loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。
机器码是E2F0,E2表示loop,F2表示位移量的补码
位移量的原码是10001111 = -16 就是位移量
③ 附上上述分析时,在debug中进行调试观察的反汇编截图
实验任务2
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,
call word ptr命令会把下一条指令的ip入栈
call dword ptr命令会把下一条指令的cs和ip入栈
寄存器(ax) = s1指令的IP
寄存器(bx) = s2指令的IP
寄存器(cx) = s2指令的CS
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论
分析结果是否一致。
编译运行:
如图可以看到s1和s2的IP和CS
如图所示ax,bx,cx的值和理论分析相符合
实验任务3
程序源代码:
assume cs:code, ds:data
data segment
x db 99, 72, 85, 63, 89, 97, 55
len equ $- x
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, offset x ; 取符号x对应的偏移地址0 -> si
mov cx, len ; 从符号x开始的连续字节数据项个数 -> cx
mov ah, 2
s1: mov ax, [si]
call pN
call pS
inc si
loop s1
mov ah, 4ch
int 21h
pN: mov bl, ax ; printNumber函数,用于打印数字,ax是入口参数
mov al, bl
mov bl, 10
mov ah, 0
div bl
mov bx, ax
mov ah, 2
mov dl, bl
or dl, 30h
int 21h
mov dl, bh
or dl, 30h
int 21h
ret
pS: mov dl, ' ' ; printSpace函数,用于打印空格
int 21h
ret
code ends
end start
程序执行结果:
实验任务4
程序源代码:
assume cs:code, ds:data
data segment
str db 'try'
len equ $ - str
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800h
mov es, ax
mov cx, len ; 从符号x开始的连续字节数据项个数 -> cx
mov si, 0
mov di, 0f00h
s: call pS
loop s
mov ah, 4ch
int 21h
pS: mov al, [si] ;printStr打印字符串
mov es:[di], al
mov al, 4
mov es:[di+1], al
inc si
add di, 2
code ends
end start
程序执行结果:
实验任务5
程序源代码:
assume cs:code, ds:data
data segment
stu_no db '201983290004'
len = $ - stu_no
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800h
mov es, ax
mov cx, 0f00h
mov si, 0
mov di, 0f00h
mov al, 11h
s1: mov es:[si+1], al
add si, 2
loop s1
mov cx, 00ffh
mov ax, 172Dh
s2: mov es:[di], ax
add di, 2
loop s2
mov cx, len
mov si, 0
mov di, 0f40h
s3: call pS
loop s3
mov ah, 4ch
int 21h
pS: mov al, [si] ;printStr打印字符串
mov ah, 17h
mov es:[di], ax
inc si
add di, 2
ret
code ends
end start
实验总结
- 本次实验主要考察了call,ret和80*25彩色字符输出,以及子程序。
- 在80*25模式下,属性字节在高位,8位二进制分别是:闪烁,背景RGB,高亮,前景RGB