Assembly 在x86 gas语法中,ARM的ldrb有任何等效功能吗?
我希望逐个字节加载一个字符串,以检查是否存在表示x86中该字符串终止的空值。我之前曾在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
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