我们必须在大会中编码,你可能很难知道。或者教授没有给我们任何关于如何正确编码或链接的信息。我们必须自己学习。明天我必须交出我的工作。 目的是将第n个斐波那契数字打印到控制台。
section .data
fmt: db "fib=%d",10,0
section .text
extern _printf
global _main, fib
_main:
mov eax, 10 ; e.g. n=10
mov ebx, 1 ; we know f_0 and f_1
sub eax, ebx ; thats why n--
push eax ; push n
push 0 ; f_0 = 0
push 1 ; f_1 = 1
call fib
push eax ; in eax the result is stored
push fmt
call _printf
mov ebx, 0
mov eax, 1 ; exit(0)
int 0x80
fib:
mov ecx, eax
pop esi
calc:
pop ebx
pop edx
add ebx, edx
mov eax, ebx
push edx
push ebx
sub ecx, 1
cmp ecx, 0
jne calc
push esi
ret
在与链接器挣扎之后,我终于设法组装并链接了我的程序。但它不起作用 - 我每次都会遇到分段错误。
修改 更正的代码 - 我在控制台上得到一些文字,但遗憾的是没有正确的数字,它总是显示“fib = 1”并再次出现故障。
答案 0 :(得分:0)
你有
push 0 ; f_0 = 0
push 1 ; f_1 = 1
call fib
然后
fib:
mov ecx, eax
calc:
pop ebx
pop edx
你不能这样做 - 调用指令将推送堆栈上的返回地址,这是你将在fib中弹出的第一件事。
答案 1 :(得分:0)
我没有找到装配很难,而是我发现它很简单直接。如果您的老师没有正确地教您,那么您可以在互联网上搜索信息。多年以前,当我们大多数人开始时,没有太多的信息,所以我们使用反复试验来学习。
我建议你从简单开始学习堆栈。使用此作为工作示例:
extern printf
section .data
msg: db "Your sum is %d",10 ,0
section .text
global _start
_start:
push 20
push 2
push 6
call AddEm
push eax
push msg
call printf
add esp, 4 * 2 ; printf is C calling convention, we have to adjust stack
mov ebx, 0
mov eax, 1 ; exit(0)
int 0x80
AddEm:
push ebp ; set up a stack frame
mov ebp, esp ; we could just use esp but we won't
mov eax, [ebp + 8] ; 1st param - 6
add eax, [ebp + 12] ; 2nd param - 2
add eax, [ebp + 16] ; 3rd param - 20
mov esp, ebp ; restore the stack
pop ebp
ret 4 * 3 ; passed 3 params, clean up stack
这就是我如何组装,链接和输出。