将字符串中的字符替换为另一个字符串的字符的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 

这真的很难得到良好的装配信息,因为有这么多不同的语法。

+0

http://stackoverflow.com/tags/x86/info有一些资源链接。英特尔insn设置参考手册详细说明了每条指令的每个允许的编码。 (例如,立即操作数,存储器源,存储器目的地等的哪些组合是可编码的。) –

没有mov需要2个内存操作数。请参阅instruction set reference。你可以通过一个字节大小的寄存器,例如:

mov dl, [rax] 
mov [rbx], dl 

还要注意,调用约定强制要求一些寄存器需要被保存,包括rbx。您可以改用rcx,或保存/恢复它。

+0

找到详述所有允许(和不允许)参数的操作码列表可能是有帮助的。也许这会有所帮助。 http://ref.x86asm.net/ – rdtsc