汇编语言(王爽第三版)检测点13

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhaixh_89/article/details/101270943

(1)在上面内容中,我们用7cH中断例程实现loop功能,则上面的7cH中断例程所能进行的最大转移位移是多少?

答案:题目描述个人感觉有二义性,因此从loop实现角度和位移值bx变量两方面来讨论

       如果从loop的指令角度上看,loop是段内短转移,它的范围是-128~127,也就是说最大转移位移是128.

       如果从bx变量来说,bx存储二进制补码数据的表示范围。对于16位来说它表示的范围是-32768~32767。

       我们知道在内存中是按照计算机补码方式存储的,最小的负数(也就是绝对值最大的数)是8000H也就是-32768,那么它最大的转移位移是32768。

(2)用7ch中断例程完成jmp near ptr s指令功能,用bx向中断例程传送转移位移。

应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。

assume cs:code
data segment
	db 'conversation', 0
data ends
code segment
	start:    mov ax, data
		  mov ds, ax
		  mov si, 0
		  
		  mov ax, 0b800h
		  mov es, ax
		  mov di, 12*160
		  
		s:cmp byte ptr [si], 0
		  je ok
		  mov al, [si]
		  mov es:[di], al
		  mov ah, 2
		  mov es:[di + 1], ah
		  inc si
		  add di, 2
		  mov bx, offset s - offset ok
		  int 7ch
	   ok:mov ax, 4c00h
		  int 21h

code ends
end start

根据题目要求,7ch的处理程序如下:

     lp:push bp
        mov bp, sp
	add [bp+2], bx
	pop bp
	iret
   lpend:nop  

源码如下:

assume cs:code
data segment
	db 'conversation', 0
data ends
code segment
	start:mov ax, cs
		  mov ds, ax
		  mov si, offset lp
		  
		  mov ax, 0
		  mov es, ax
		  mov di, 200h
		  mov cx, offset lpend - offset lp
		  
		  cld			;传输方向为正
		  rep movsb		;字节传输
		  
		  ;设置7ch到中断向量表
		  mov ax, 0
		  mov es, ax
		  mov word ptr es:[7ch*4], 200h
		  mov word ptr es:[7ch*4 + 2], 0
		  
		  mov ax, data
		  mov ds, ax
		  mov si, 0
		  
		  mov ax, 0b800h
		  mov es, ax
		  mov di, 12*160
		  
		s:cmp byte ptr [si], 0
		  je ok
		  mov al, [si]
		  mov es:[di], al
		  mov ah, 2    ;这里是为了便于观察程序执行结果
		  mov es:[di + 1], ah
		  inc si
		  add di, 2
		  mov bx, offset s - offset ok
		  int 7ch
	   ok:mov ax, 4c00h
		  int 21h

	   lp:push bp
		  mov bp, sp
		  add [bp+2], bx
		  pop bp
		  iret
    lpend:nop  
code ends
end start

程序运行如下:

题目主要考察对于比较指令cmp的理解使用和对段内近转移jmp near ptr s指令的掌握情况

猜你喜欢

转载自blog.csdn.net/zhaixh_89/article/details/101270943