【问题标题】:Any equivalent function of ARM's ldrb in x86 gas syntax?x86气体语法中ARM ldrb的任何等效功能?
【发布时间】:2014-11-30 21:17:02
【问题描述】:

我正在寻找逐字节加载字符串以检查表示该字符串在 x86 中终止的空值。我之前在 ARM 中使用 ldrb 这样做过:

loop:
    ldrb    r1, [r0], #1 //Load next byte of string into r0
    cmp     r1, #0 //Check this byte against 0
    beq     end //If the byte is equal stop and print
    //... Other operations omitted  
    b       loop//Branch back to top

在此示例中,r0 保存字符串,ldrb 用于在每个循环周期将下一个 1 字节加载到 r1。我希望在 x86 中做大致相同的事情

【问题讨论】:

    标签: assembly x86 gnu-assembler


    【解决方案1】:

    您肯定有指令集参考。真的没有办法知道基本的数据移动和比较指令。你不应该依赖勺子喂食。

    也就是说,ldrb 的 x86 对应项称为 movzblmove zero 将 byte 扩展为 long,在 intel 语法中称为 movzx)。以下是使用eax 表示r0edx 表示r1 的示例实现:

    loop:
        movzbl 1(%eax), %edx
        cmpl $0, %edx
        je end
        // ... other operations omitted
        jmp loop
    

    另外请注意,x86 是 CISC 并且支持直接在内存上操作,这意味着您可以将内存中的值与 0 进行比较,而无需加载到寄存器中。如果不需要字符的值,可以使用它。

    此外,x86寄存器的某些部分可以直接使用,这种情况下可以写movb 1(%eax), %dl来使用%edx的低8位。然后前 24 位保持不变,因此您也应该只使用字节大小的比较。

    说到比较,零测试的常见习语包括使用andortest 指令,两个操作数都是相关寄存器,例如test %edx, %edx。这样做是因为它们会产生更短的机器代码。

    【讨论】:

    • 谢谢,现在一切似乎都正常了。对此,我真的非常感激!我确实有一个指令集参考,但它有点令人费解,我花了过去一天左右的时间试图弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2023-03-31
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多