我希望逐字节加载字符串以检查表示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中做同样的事情
答案 0 :(得分:2)
当然你有一个指令集参考。实际上无法了解基本数据移动和比较指令。你不应该依靠用勺子喂食。
也就是说,与ldrb
对应的x86称为movzbl
( mov e z ero扩展 b yte到 l ong,在intel语法中称为movzx
。以下是使用eax
r0
和edx
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位保持不变,所以你也应该只使用字节大小的比较。
说到比较,零测试的常用习语包括使用and
,or
或test
指令,两个操作数都是相关的寄存器,例如test %edx, %edx
。这样做是因为它们产生了更短的机器代码。