Assembly 跳过空格-REPZ SCASB

Assembly 跳过空格-REPZ SCASB,assembly,masm,Assembly,Masm,我试图在汇编程序中解析命令行参数,我想跳过前导空格。根据我所知道的和在网络上确认的(例如),简单地REPE SCASB或REPZ SCASB就可以做到这一点。但事实并非如此。它不是在第一个非空格字符处停止,而是在下一个字符处停止(使用Turbo调试器进行调试证明了这一点)。此模式始终重复出现-如果有一个或五十个空格,则没有区别,ES:DI始终指向第一个非空格字符后面的字节。为了使用CX中的计数器进行验证,我需要此表达式正常工作 我在Ubuntu12.04的DosBox下使用MASM(ML.EXE

我试图在汇编程序中解析命令行参数,我想跳过前导空格。根据我所知道的和在网络上确认的(例如),简单地
REPE SCASB
REPZ SCASB
就可以做到这一点。但事实并非如此。它不是在第一个非空格字符处停止,而是在下一个字符处停止(使用Turbo调试器进行调试证明了这一点)。此模式始终重复出现-如果有一个或五十个空格,则没有区别,
ES:DI
始终指向第一个非空格字符后面的字节。为了使用
CX
中的计数器进行验证,我需要此表达式正常工作

我在Ubuntu12.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

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


正如其他人所说,在现代x86版本中(如在不到25年的历史中),字符串指令除了有时较小的代码之外没有任何优势。

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


正如其他人所说,在现代x86版本中(如在不到25年的历史中),字符串指令除了有时较小的代码之外没有任何优势。

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


正如其他人所说,在现代x86版本中(如在不到25年的历史中),字符串指令除了有时较小的代码之外没有任何优势。

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



正如其他人所说,在现代x86版本中(如不到25年前的版本),字符串指令除了有时较小的代码之外没有任何优势。

提示:CX有正确的价值吗?
实际上等于控制台缓冲区中使用的空间吗?(可能它们有不同的值?0xA0,0x00也可以显示为空格)@ssg I在TurboDebugger中选中,源代码中的硬编码和命令行空格都编码为0x20。是的,我误解了您的问题。提示:CX的值正确吗?
实际上等于控制台缓冲区中使用的空间吗?(可能它们有不同的值?0xA0,0x00也可以显示为空格)@ssg I在TurboDebugger中选中,源代码中的硬编码和命令行空格都编码为0x20。是的,我误解了您的问题。提示:CX的值正确吗?
实际上等于控制台缓冲区中使用的空间吗?(可能它们有不同的值?0xA0,0x00也可以显示为空格)@ssg I在TurboDebugger中选中,源代码中的硬编码和命令行空格都编码为0x20。是的,我误解了您的问题。提示:CX的值正确吗?
实际上等于控制台缓冲区中使用的空间吗?(可能它们有不同的值?0xA0,0x00也可以显示为空格)@ssg我在TurboDebugger中检查过,源代码中的硬编码和命令行空格都被编码为0x20。是的,我误解了你的问题。我错过了OP说“它在下一个停止”的部分。我以为它停在第一个空间。你的答案是正确的。谢谢你的澄清。我从我的帖子中的链接中得到了关于“查找从ES:[(E)DI]开始的非AL字节”的建议。我把它理解为“查找第一个非AL字节”。