【发布时间】:2016-03-18 05:21:29
【问题描述】:
我是汇编新手,如果问题很明显,很抱歉。我正在尝试解决一个汇编程序,我需要逐个字符地解析字符串并对字符进行一些操作并将其存储在另一个程序中字符串。所以我的问题是如何在 nasm 程序集中逐个字符地解析字符串。
【问题讨论】:
-
这些操作是否取决于您检查它是否是回文?
我是汇编新手,如果问题很明显,很抱歉。我正在尝试解决一个汇编程序,我需要逐个字符地解析字符串并对字符进行一些操作并将其存储在另一个程序中字符串。所以我的问题是如何在 nasm 程序集中逐个字符地解析字符串。
【问题讨论】:
做这样的事情:
mov si, <adress of the string in memory>
mov cx, <whatever value tells you how long the string is>
cld ; make sure lodsb walks forward, not back (that'd be std then)
again:
lodsb ; get next char to AL and increase SI
;
; <al contains each char of string here, one by one>
;
dec cx
jnz again ; same as "loop", but not so small
【讨论】:
mov cx, stringLen 给 OP 带来麻烦。也许是正确的,或者说你是为 MASM 写的。
loop这样的慢指令,你不妨全力以赴地争取代码大小而不是速度,并使用lodsb而不是mov/@987654327 @.
loop is still slow, except on AMD Bulldozer-family。我在那次问答中找到了一些似是而非的答案和有趣的历史。无论如何,手动编写非最佳 asm 是没有意义的,IMO,并且在答案中给出不好的示例习语是不行的。一切都很重要,否则只需使用编译器。 (当然,优化大小是有效的。)唯一一次我会放松我对效率的立场是写一个引导扇区或其他东西在 asm 中更容易,并且只需要工作。