10.12 寄存器冲突的问题

一开始忘记了入栈的顺序导致程序无法执行。
根据书中的指令,必须ip先入栈,cx再入栈(先进后出,后进先出),所以是先执行call指令,再执行push指令。
但是其实也可以反过来(参考程序2)

;程序1
assume cs:code
data segment
	db 'word',0
	db 'unix',0
	db 'wind',0
	db 'good',0
data ends
code segment
start:	mov ax,data
		mov ds,ax
		mov bx,0
		mov cx,4
;inc si
;bx+5H
s:
		mov si,bx	;si=(bx)=5n,n=0,1,2,3,4
		call capital	;ip入栈,栈顶是"add bx,5"所在的地址
		add bx,5
		loop s		;cx-1
		mov ax,4c00h
		int 21h
capital:	push cx		;cx入栈,栈顶是cx的值
change:		mov cl,[si]
			mov ch,0
			jcxz ok		;此时si=4n,n=1,2,3,4
			and byte ptr [si],11011111b
			inc si
			jmp short change
ok:		pop cx	;cx出栈
		ret	;ip出栈,即跳转到"add bx,5"所在的地址,执行该指令

code ends
end start 

g mov ax,4c00h所在的地址
在这里插入图片描述
在这里插入图片描述

;程序2
assume cs:code
data segment
	db 'word',0
	db 'unix',0
	db 'wind',0
	db 'good',0
data ends
code segment
start:	mov ax,data
		mov ds,ax
		mov bx,0
		mov cx,4
;inc si
;bx+5H
s:
		mov si,bx	;si=(bx)=5n,n=0,1,2,3,4
		push cx
		call capital	;ip入栈,栈顶是"add bx,5"所在的地址
		add bx,5
		pop cx		;cx出栈
		loop s		;cx-1
		mov ax,4c00h
		int 21h
capital:	nop	;空指令,这里的跳转主要是为了执行下面部分的程序
change:		mov cl,[si]
			mov ch,0
			jcxz ok		;此时si=4n,n=1,2,3,4
			and byte ptr [si],11011111b
			inc si
			jmp short change
ok:	
		ret	;ip出栈,即跳转到"add bx,5"所在的地址,执行该指令

code ends
end start 

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值