【问题标题】:Parsing string byte by byte in nasm assembly for 32-bit architecture在 32 位架构的 nasm 程序集中逐字节解析字符串
【发布时间】:2016-03-18 05:21:29
【问题描述】:

我是汇编新手,如果问题很明显,很抱歉。我正在尝试解决一个汇编程序,我需要逐个字符地解析字符串并对字符进行一些操作并将其存储在另一个程序中字符串。所以我的问题是如何在 nasm 程序集中逐个字符地解析字符串。

【问题讨论】:

  • 这些操作是否取决于您检查它是否是回文?

标签: assembly nasm


【解决方案1】:

做这样的事情:

    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

【讨论】:

  • 这个问题被标记为 NASM,所以写 mov cx, stringLen 给 OP 带来麻烦。也许是正确的,或者说你是为 MASM 写的。
  • 如果你打算使用像loop这样的慢指令,你不妨全力以赴地争取代码大小而不是速度,并使用lodsb而不是mov/@987654327 @.
  • @Peter 是“循环”它仍然很慢?我记得我阅读了一些发行说明,他们修复了它......或者他们不会修复它,因为没有人使用它? :P 不知道 :) 我希望在这种情况下,+- 一些 cpu 周期无关紧要
  • @Fifoernik 因为他没有向我们展示他的刺痛是如何存储的,以及他从哪里获得 信息,所以我无法“纠正”任何事情。可能字符串在 BX 中,大小在 AX 中?或者它是记忆中的常数?谁知道......我无法预测他想要什么,如果他没有向我们展示至少所需的最少代码
  • loop is still slow, except on AMD Bulldozer-family。我在那次问答中找到了一些似是而非的答案和有趣的历史。无论如何,手动编写非最佳 asm 是没有意义的,IMO,并且在答案中给出不好的示例习语是不行的。一切都很重要,否则只需使用编译器。 (当然,优化大小是有效的。)唯一一次我会放松我对效率的立场是写一个引导扇区或其他东西在 asm 中更容易,并且只需要工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 2015-10-06
  • 2020-03-21
相关资源
最近更新 更多