我有个密码:
SECTION .data
message: db "Value = %d", 10, 0
message2: db "End", 10, 0
SECTION .bss
SECTION .text
extern printf
global main
main:
push ebp
mov ebp, esp
mov ebx, 0
jmp loop
push message2
call printf
mov esp, ebp
pop ebp
ret
loop:
push ebx
push message
call printf
inc ebx
cmp ebx, 100000
jne loop
mov esp, ebp
pop ebp我想知道如何返回main,然后打印message2?
谢谢你的帮助,为我的英语道歉。
发布于 2014-03-22 19:59:18
问题是,您正在调用使用cdecl调用约定的C-函数(调用方必须清理堆栈)。这意味着在调用之后,必须将参数的大小(以字节为单位)添加到堆栈指针中。第一个printf使用2个dword参数(8个字节),因此必须在调用后将8个添加到堆栈指针中。第二个调用传递一个dword,因此将4添加到堆栈指针中。
这应该是可行的:
SECTION .data
message: db "Value = %d", 10, 0
message2: db "End", 10, 0
SECTION .bss
SECTION .text
extern printf
global main
main:
push ebp
mov ebp, esp
mov ebx, 0
call loop
push message2
call printf
add esp, 4
mov esp, ebp
pop ebp
ret
loop:
push ebx
push message
call printf
add esp, 8
inc ebx
cmp ebx, 10000
jne loop
ret发布于 2014-03-12 04:43:52
这样试一试:
区段.data
message: db "Value = %d", 10, 0
message2: db "End", 10, 0区段.bss
区段.text
外印全球主
主要:
push ebp
mov ebp, esp
mov ebx, 0
call loop
push message2
call printf
mov esp, ebp
pop ebp
ret循环:
push ebx
push message
call printf
inc ebx
cmp ebx, 100000
jne loop
ret发布于 2014-03-12 04:50:50
https://stackoverflow.com/questions/22342022
复制相似问题