gpt4 book ai didi

将 C 转换为具有分段问题的 NASM 程序集

转载 作者:太空狗 更新时间:2023-10-29 15:08:54 25 4
gpt4 key购买 nike

我正在尝试获取此 C 代码:

main()

{int x, y, count ;

count = 0 ;
x = 10 ;
y = 2 ;
while (y < x)
{ x = x + 1 ;
y = y + 2 ;
count = count + 1 ;
}

printf(“ It took %d iterations to complete loop. That seems like a lot\n”,count) ;
}

到我目前拥有的 NASM 等价物:

segment .data

out1 db "It took ", 0
out2 db "%i ", 0
out3 db "iterations to complete the loop. That seems like a lot.", 10, 0

segment .bss

segment .text

global main
extern printf

main:

mov eax, 0 ;count
mov ebx, 10 ;x
mov ecx, 2 ;y

jmp lp

mov eax, 0
ret

lp:
cmp ecx, ebx ;compare y to x
jge end ;jump to end if y >= x
add eax, 1
add ebx, 1
add ecx, 2
jmp lp

end:

push out1
call printf

push eax
push out2
call printf

push out3
call printf

我一直遇到段错误,但我不明白为什么它会一直发生。我试过在各处添加打印语句,但找不到故障所在。任何建议都会很棒!谢谢!

最佳答案

我认为您没有遵循 printf 的调用约定(它是 cdecl IIRC)。

  1. 调用者必须在调用后清理堆栈
  2. 并且 eax 被第一次调用 printf 及其返回值破坏了

当从 main 返回时,第一个会引起麻烦。实际上,在 printf 之后没有 ret 指令导致执行继续直到出现问题:)

打印后添加如下内容:

   add     esp, 16  ; Fix stack, usually it's done after each call
; with the appropiate values.
; In this way (one fixup for many calls) stack
; grows unnecessarily
xor eax, eax ; set return value to 0
ret ; Return from main

尽管如此,这并没有解决第二个问题。

关于将 C 转换为具有分段问题的 NASM 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29955467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com