汇编语言实验三

实验任务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  阅读(142)  评论(1编辑  收藏  举报