汇编语言 int指令代替 loop指令

问题:使用7ch中断例程完成loop指令的功能
loop 指令的功能:(1)判断cx值是否为0
(2)不是则跳转到标号s处
应用举例:在屏幕中间显示80个‘ !’

assume codesg
codesg segment
start:		mov ax,0b800h
			mov es,ax
			mov di,160*12
			
			mov bx,offset s - offset se   ;注意这里使用标号s的偏移地址减去标号se的偏移地址
			mov cx,80
		s:	mov byte ptr es,[di],'!'
			add di,2
			mov ax,4c00h
			int 7ch	
			se:nop
			
			mov	ax,4c00h		
			int 21h
codesg ends
end start

;7ch中断例程如下
	lp:		push bp
			   	mov bp,sp
				dec cx
				jcxz lpret
				add [bp+2],bx
		lpret:	pop bp
				iret

解释:
(1)进入中断例程时 先要pushf 再 push CS 然后 push IP,由此可知栈中数据的存放顺序
(2)中断例程执行完成 使用iret指令还原 标志寄存器 CS IP 即 pop IP / pop CS / popf
(3) int 7ch引发中断过程后,进入中断例程,在中断过程中,当前的标志寄存器、CS和IP都要压栈,此时压入的CS和IP中的内容,分别是调用程序的段地址(可以认为是标号s的段地址)和int 7ch后一条指令的偏移地址(即标号se的偏移地址)
可见,在中断例程中,可以从栈中取得标号s的段地址和标号se的偏移地址,而用标号se的偏移地址加上bx中存放的转移位移(这里bx中的值为负数)就可以得到标号s的偏移地址
(4) 可以利用iret指令,设置CS:IP 就是说 只要将栈中的CS和IP值修改为标号s处的CS和IP 然后再用iret指令 就可以将CS:IP指向标号s的地址
(5)根据 先要pushf 再 push CS 然后 push IP 可得 栈中存放的数据的顺序为 栈顶处为IP 下面是CS 再下面是 flag值
(6)mov bp,sp 得到栈顶位置,add [bp+2],bx 将占中的IP加上转移位移 即标号s处的偏移位移 注意 没有显示说明段寄存器是 bp对应的默认寄存器为ss
(7) iret 指令 等价于 pop IP / pop CS / popf 就是说 iret指令 同时设置了CS IP flag的值

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第三章 8086/8088的寻址方式和指令系统 练习题 一.单项选择题 1.设BX=2000H,SI=3000H,指令MOV AX,[BX+SI+8]的源操作有效地址为( )。 A.5000H B.5008H C.23008H D.32008H 2.设DS=1000H,ES=2000H,BX=3000H,指令ADD AL,[BX]的源操作数的物理址为(  )。 A.13000H B.23000H C.33000H D. 3000H 3.设DS=2000H,ES=3000H,SI=200H,指令MOV ES:[SI],AL的目的操作数的物理地址为( )。 A.20200H B.30200H C.50200H D.200H 4.指令MOV MEM[BX],AX中的MEM是( )。 A.原码 B.反码 C.补码 D.移码 5.用来作为寄存器间接寻址的寄存器有( )个。 A.8 B.6 C.5 D.4 6.指令MOV [BX+SI],AL中的目的操作数使用( )段寄存器。 A.CS B.DS C.SS D.ES 7.指令MOV BX,[BP+5]中的源操作数使用( )段寄存器。 A.CS B.DS C.SS D.ES 8.段内间接寻址只改变( )中的内容。 A.CS B.IP C.CS和IP D.PSW 9.段间间接寻址只改变( )中的内容。 A.CS B.IP C.CS和IP D.PSW 10.下述指令中不改变PSW的指令是( )。 A.MOV AX,BX B.AND AL,0FH C.SHR BX,CL D.ADD AL,BL 11.下述指令中不影响CF的指令是( )。 A.SHL AL,1 B.INC CX C.ADD [BX],AL D.SUB AX,BX 12.两个整数补码9CH和7AH相加运算后,会产生( )。 A.无溢出且无进位 B.无溢出但有进位 C.有溢出且有进位 D.有溢出但无进位 13.指令JMP WORD PTR [BX]属于( )寻址。 A.段内直接 B.段内间接 C.段间直接 D.段间间接 14.指令MOV AX,[BX+SI+8]的源操作数属于( )寻址。 A.直接 B.寄存器相对 C.基址变址 D. 相对基址变址 15.指令( )不改变CF的内容。 A.DEC AL B.ADD AX,CX C.SUB [BX],CL D.SBB AL,DL 16.十进制数字74所对应的压缩型BCD码的形式是( )。 A.74 B.74H C.4AH D.4A 17.十进制数字85所对应的非压缩型BCD码的形式是( )。 A.0085 B.0085H C.0805 D.0805H 18.设AL=67H,执行“CMP AL,76H”后,AL=( )。 A.76H B.0DFH C.67H D.00 19.设AL=65H,BL=29H,执行下列指令后,AL=( )。 ADD AL,BL DAA A.8EH B.94 C.94H D.8E 20.压栈操作是( )位数的操作。 A.8 B.16 C.32 D.任意 21.执行IMUL指令时,如果乘积的高位部分不是低位部分的符号扩展,则( )。 A.OF=0、CF=0 B.OF=0、CF=1 C.OF=1、CF=0 D.OF=1、CF=1 22.设AX=3762H,CL=5,执行“SHR AX,CL”后,AX=( )。 A.0376H B.01BBH C.01BB D.0376 23.若要在BUF缓冲区中寻找与AL中不相等的数据,应使用( )SCASB串操作指令。 A.REPNE B.REP C.REPE D.REPNZ

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值