一开始忘记了入栈的顺序导致程序无法执行。
根据书中的指令,必须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