我正在尝试解析汇编程序中的命令行参数,我想跳过前导空格。根据我所知道的以及在网络中确认的内容(例如http://faydoc.tripod.com/cpu/repz.htm),只需REPE SCASB
或REPZ SCASB
即可。但事实并非如此。它不是停留在第一个非空格字符,而是停在下一个字符处(通过使用Turbo Debugger进行调试证明)。这种模式一直重新出现 - 如果有一个或五十个空格没有区别,ES:DI
总是指向第一个非空格字符后面的字节。我需要此表达式才能正常工作,以便在CX
中使用计数器进行验证。
我在Ubuntu 12.04上的DosBox下使用MASM(ML.EXE)编译器。
.287
dane1 segment
dane1 ends
code1 segment
start1:
; ******** CODE ********
; Init stack
mov sp, offset wstosu
mov ax, seg wstosu
mov ss, ax
; transcription start ==========
mov cs:[paramsAddress], es
xor cx, cx
mov cl, byte ptr es:[0080h] ; number of characters from command line
cmp cx, 0
je error
mov al, ' '
mov di, 0081h ; beginning of actual console input
cld
repe scasb ; skip spaces
; here es:di should point to the first
; non-space character (or end of input)
cmp cx, 0
je error
答案 0 :(得分:3)
你看到了正确的行为。 scasb
指令使用当前di
内容和递增di
(或基于DF的递减)设置条件代码。 repe
前缀就像scasb
周围的“do ... while”循环一样。只要条件成功(并且递减的cx
寄存器非零),它就会测试条件代码和重复。因此,当扫描超过前导空格的第一个字符时,测试失败并且重复停止,但di
寄存器已经增加到下一个字符。您只需要在代码中考虑到这一点,最简单的方法是递减di
。
正如其他人所说,在现代x86版本中(不到25年左右),字符串指令没有任何优点,除了有时候较小的代码中的一小部分。