Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在x86 gas语法中,ARM的ldrb有任何等效功能吗?_Assembly_X86_Gnu Assembler - Fatal编程技术网

Assembly 在x86 gas语法中,ARM的ldrb有任何等效功能吗?

Assembly 在x86 gas语法中,ARM的ldrb有任何等效功能吗?,assembly,x86,gnu-assembler,Assembly,X86,Gnu Assembler,我希望逐个字节加载一个字符串,以检查是否存在表示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 operation

我希望逐个字节加载一个字符串,以检查是否存在表示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中做大致相同的事情,当然您有一个指令集参考。根本没有办法了解基本数据移动和比较说明。你不应该指望别人用勺子喂你

这就是说,ldrb的x86对应项称为movzbl将零扩展字节移动到长,在intel语法中称为movzx。下面是一个示例实现,使用eax表示r0,使用edx表示r1:

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

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


说到比较,零测试的常见习惯用法包括使用and、or或测试指令,并且两个操作数都是相关寄存器,例如测试%edx、%edx。之所以这样做,是因为它们会产生更短的机器代码。

谢谢,现在一切似乎都正常了。我真的很感激!我确实有一个指令集参考,但它有点复杂,我花了一天左右的时间试图弄清楚它。
loop:
    movzbl 1(%eax), %edx
    cmpl $0, %edx
    je end
    // ... other operations omitted
    jmp loop