汇编语言实验三

实验任务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

实验总结

  1. 本次实验主要考察了call,ret和80*25彩色字符输出,以及子程序。
  2. 在80*25模式下,属性字节在高位,8位二进制分别是:闪烁,背景RGB,高亮,前景RGB
posted @ 2021-11-23 18:44  fyhtom  阅读(183)  评论(1)    收藏  举报