我試圖將我的C代碼轉換爲x86-64。我的目標是扭轉鏈接列表。傳入的兩個參數是頭部ptr和偏移量以獲取指針字段的地址(即指向列表中下一個節點的指針)。將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