私のCコードをx86-64に変換しようとしています。私の目標は、リンクされたリストを逆転させることです。渡される2つのパラメータは、ポインタフィールドのアドレス(すなわち、リスト内の次のノードへのポインタ)を得るためのhead ptrおよびoffsetである。Cコードをx86-64アセンブリに変換する
私が理解するところでは、ヘッドptrはrdiレジスタを通過し、オフセットはrsiレジスタを介して渡されます。私はそれがライン "mov rcx、[rbx]に達すると、セグメンテーションフォールトを取得し続けます。" "mov rcx、rbx"だけで、 "mov [rbx]、rdx"から "mov rbx、rdx"に変更されると、セグメンテーションフォールトがなくなります。しかし、同じ値を何度も繰り返し割り当てているので、無限ループに終わります。
私のCコードに従うとき、x86-64のロジックはすべて私にとって意味があるので、私は本当に停止しています。何か案は?これは初めてのx86-64を使用しています。
.intel_syntax noprefix
.text
.global reverse_asm_64
reverse_asm_64:
push rbx
push r12
mov rax, 0x0
#headptr
mov rbx, rax
#nextptr
mov rcx, rax
#new_headptr
mov rdx, rax
#head
mov rax, [rdi]
#checks if head is null
cmp rax, 0
je null_ret
#move offset into a register
mov r12, rsi
add rax, r12
#add offset to rax to get the next ptr
mov rbx, rax
while_start:
#checks that next ptr isn't null
cmp rbx, 0x0
je while_done
#setting the next ptr
mov rcx, [rbx]
# *headptr = new_headptr
mov [rbx], rdx
#new_headptr = headptr
mov rdx, rbx
#sets headptr to nextptr
mov rbx, rcx
jmp while_start
while_done:
mov rax, rdx
sub rax, rsi
null_ret:
pop r12
pop rbx
ret
このような一見無駄な運動の理由はありますか? –
これには本当に良いツールがあります:Cコンパイラ。それらの多くはアセンブリコードを発行するオプションを持っていますが、そうでないものは逆アセンブラと組み合わせることができます。 –
誰かがこれが役に立たない運動であることに同意してうれしいです。私はクラスの割り当てのためにそれを完了する必要がありますが、私は過去数日間立ち往生してきました。 – Ryan