movsb=lodsb+stosb?
NO!
学习汇编语言时我以为movsb就等于lodsb+stosb,当然后者编程变化更多,但最近竟然因此让我不得不升级“模载作坊”V.COM。
请DEBUG下面的程序:
code segment
assume cs:code,ds:code,es:code
org 100h
start:
cld
mov si,offset src
mov di,offset tgt1
_1:movsb ;跟踪时发现AL的值根本不受影响,恒定为0!
or al,al
jnz _1
int 3
;所以_1这段程序只传送了一个‘0’,就结束了。
;下面的程序段能够完成全部传送。
mov si,offset src
mov di,offset tgt2
_2:movsb
cmp byte ptr ,0 ;此行是不得已而为之!
jnz _2
int 3
mov si,offset src
mov di,offset tgt3
_3:lodsb ;此处获得AL值
stosb
or al,al
jnz _3
int 3
mov ah,4Ch
int 21h
even
src db '012abcABC+-*/|}',0
tgt1 db 16 dup(1)
tgt2 db 16 dup(2)
tgt3 db 16 dup(3)
code ends
end start
总之一句话:汇编语言的学习一定要多多DEBUG(不限于微软的DEBUG.EXE),如果接受命令行参数,更要DEBUG到每个字节的传送和确认。否则,程序很容易带上BUGS。
NO!
学习汇编语言时我以为movsb就等于lodsb+stosb,当然后者编程变化更多,但最近竟然因此让我不得不升级“模载作坊”V.COM。
请DEBUG下面的程序:
code segment
assume cs:code,ds:code,es:code
org 100h
start:
cld
mov si,offset src
mov di,offset tgt1
_1:movsb ;跟踪时发现AL的值根本不受影响,恒定为0!
or al,al
jnz _1
int 3
;所以_1这段程序只传送了一个‘0’,就结束了。
;下面的程序段能够完成全部传送。
mov si,offset src
mov di,offset tgt2
_2:movsb
cmp byte ptr ,0 ;此行是不得已而为之!
jnz _2
int 3
mov si,offset src
mov di,offset tgt3
_3:lodsb ;此处获得AL值
stosb
or al,al
jnz _3
int 3
mov ah,4Ch
int 21h
even
src db '012abcABC+-*/|}',0
tgt1 db 16 dup(1)
tgt2 db 16 dup(2)
tgt3 db 16 dup(3)
code ends
end start
总之一句话:汇编语言的学习一定要多多DEBUG(不限于微软的DEBUG.EXE),如果接受命令行参数,更要DEBUG到每个字节的传送和确认。否则,程序很容易带上BUGS。
my major is english----my love is dos----my teacher is the buddha----my friends--how about U
