将字符串中的字符替换为另一个字符串的字符的asm等效物是什么?
问题描述:
我想编码strcat学习大会。我使用64位程序集,使用英特尔语法在mac osx上使用nasm进行编码。 这里是我的结果至今:将字符串中的字符替换为另一个字符串的字符的asm等效物是什么?
section .text
global _ft_strcat
_ft_strcat:
mov rax, rdi
mov rbx, rsi
loop_s1:
cmp byte[rax], 0
jz copy_str
inc rax
jmp loop_s1
copy_str:
cmp byte[rbx], 0
jz end
mov byte[rax], byte[rbx]
inc rax
inc rbx
jmp copy_str
end:
mov byte[rax], 0
ret
线mov byte[rax], byte[rbx]
给我这个编译错误:
ft_strcat.s:17: error: invalid combination of opcode and operands
这真的很难得到良好的装配信息,因为有这么多不同的语法。
答
没有mov
需要2个内存操作数。请参阅instruction set reference。你可以通过一个字节大小的寄存器,例如:
mov dl, [rax]
mov [rbx], dl
还要注意,调用约定强制要求一些寄存器需要被保存,包括rbx
。您可以改用rcx
,或保存/恢复它。
+0
找到详述所有允许(和不允许)参数的操作码列表可能是有帮助的。也许这会有所帮助。 http://ref.x86asm.net/ – rdtsc
http://stackoverflow.com/tags/x86/info有一些资源链接。英特尔insn设置参考手册详细说明了每条指令的每个允许的编码。 (例如,立即操作数,存储器源,存储器目的地等的哪些组合是可编码的。) –