Assembly 跳转后如何返回主控台?
嗯,我有这个代码:Assembly 跳转后如何返回主控台?,assembly,x86,nasm,Assembly,X86,Nasm,嗯,我有这个代码: 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 m
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
谢谢你的帮助,我的英语很抱歉。这样试试:
第二节数据
message: db "Value = %d", 10, 0
message2: db "End", 10, 0
第2节bss
第节.案文
外部打印
全球主要
主要内容:
循环:
push ebx
push message
call printf
inc ebx
cmp ebx, 100000
jne loop
ret
可能排名不够,无法添加评论 在jmp之前推送返回地址 见此:
问题是您正在调用使用cdecl调用约定的C函数(调用方必须清除堆栈)。这意味着在调用之后,必须将参数的大小(以字节为单位)添加到stackpointer。您的第一个printf接受2个dword参数(8字节),因此必须在调用后向stackpointer添加8。您的第二个调用传递了一个dword,因此您向堆栈指针添加了4个dword 这应该起作用:
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
如何返回到
main
中的操作系统?顺便说一句,调用后应该清除堆栈中的传出参数。@gsg类似的东西?是的,但在循环中。我试过了,但它返回SEGFULT,你可以在pastebin中发布代码吗?谢谢回答,但这种方式返回SEGFULT。对不起,在循环中,它应该是push ebx,然后push message,然后call。嗯,我看你在pastebin中的代码是正确的,所以我不知道……对不起!谢谢你的回答,但你能给我举个例子吗?
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