跳过空格 - REPZ SCASB

时间:2014-06-14 15:06:21

标签: assembly masm

我正在尝试解析汇编程序中的命令行参数,我想跳过前导空格。根据我所知道的以及在网络中确认的内容(例如http://faydoc.tripod.com/cpu/repz.htm),只需REPE SCASBREPZ 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

1 个答案:

答案 0 :(得分:3)

你看到了正确的行为。 scasb指令使用当前di内容和递增di(或基于DF的递减)设置条件代码。 repe前缀就像scasb周围的“do ... while”循环一样。只要条件成功(并且递减的cx寄存器非零),它就会测试条件代码和重复。因此,当扫描超过前导空格的第一个字符时,测试失败并且重复停止,但di寄存器已经增加到下一个字符。您只需要在代码中考虑到这一点,最简单的方法是递减di

正如其他人所说,在现代x86版本中(不到25年左右),字符串指令没有任何优点,除了有时候较小的代码中的一小部分。