![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 09:39 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » movsb=lodsb+stosb? NO! |
| 可打印版本 1,404 / 2 |
| 第1楼 本是 | 发表于 2008-11-12 09:02 |
| 银牌会员 发帖 790 积分 2,227 | |
|
movsb=lodsb+stosb? NO! 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。 |
|
| 第2楼 netwinxp | 发表于 2008-11-12 11:24 |
| 高级用户 发帖 366 积分 741 | |
|
串操作指令里面只有SCAS、LODS、STOS会影响或受影响AL/AX/EAX,MOVS、CMPS、INS、OUTS好像都没有提到AL...
另外MOVSB一般采用把源串长度放进CX来控制传送的次数,而不用判断目标单元的值。 [ Last edited by netwinxp on 2008-11-12 at 11:45 ] |
|
| 第3楼 本是 | 发表于 2008-11-12 19:55 |
| 银牌会员 发帖 790 积分 2,227 | |
|
同意2楼说法,更明确地说,只有LODS能够影响(E)AL/X(当然最原始的MOV al/ax/eax,也是可以的),SCAS/STOS涉及(E)AL/X,MOVS、CMPS、INS、OUTS与(E)AL/X无关。
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |