当前位置: 技术问答>linux和unix
linux下的一个很简单的汇编程序 百思不得其解阿,请各位大哥帮帮小弟
来源: 互联网 发布时间:2015-12-10
本文导语: .section .data output1: .ascii "ebx: %dn" output2: .ascii "eax: %dn" .section .text .globl main main: movl $18,%eax movl $11,%ebx pushl %ebx pushl $output1 call printf # addl $8,%esp pushl %eax pushl $output2 call printf pushl $0 call exit #...
.section .data
output1:
.ascii "ebx: %dn"
output2:
.ascii "eax: %dn"
.section .text
.globl main
main:
movl $18,%eax
movl $11,%ebx
pushl %ebx
pushl $output1
call printf
# addl $8,%esp
pushl %eax
pushl $output2
call printf
pushl $0
call exit
#怎么也得不出正确答案
我想应该输出
ebx: 11
eax: 18
但总是输出
ebx: 11
eax: 3323728
eax: 24
请各位帮忙阿
output1:
.ascii "ebx: %dn"
output2:
.ascii "eax: %dn"
.section .text
.globl main
main:
movl $18,%eax
movl $11,%ebx
pushl %ebx
pushl $output1
call printf
# addl $8,%esp
pushl %eax
pushl $output2
call printf
pushl $0
call exit
#怎么也得不出正确答案
我想应该输出
ebx: 11
eax: 18
但总是输出
ebx: 11
eax: 3323728
eax: 24
请各位帮忙阿
|
1、输出eax: 3323728的原因是output1是被设置成.ascii类型的,output1结尾没有'',所以程序会把output1和output2看成一个字符串。改正的方法是把output1和output2的类型都改成是.string 类型的。
2、输出eax: 24而不是eax: 18的原因是程序通常会把函数的返回值放在%eax中,程序在调用printf的时候就已经把%eax的值改变了。改正的方法是在pushl %eax前面重新将%eax赋值movl $18, %eax,或者在调用第一个printf之前将%eax压栈,在之后将%eax的值弹出栈。
2、输出eax: 24而不是eax: 18的原因是程序通常会把函数的返回值放在%eax中,程序在调用printf的时候就已经把%eax的值改变了。改正的方法是在pushl %eax前面重新将%eax赋值movl $18, %eax,或者在调用第一个printf之前将%eax压栈,在之后将%eax的值弹出栈。
|
添加
.section .data
output1:
.ascii "ebx: %dn"
output2:
.ascii "eax: %dn"
.section .text
.globl main
main:
movl $18,%eax
movl $11,%ebx
pushl %ebx
pushl $output1
call printf
addl $8,%esp
pushl %eax
pushl $output2
call printf
pushl $0
call exit
.section .data
output1:
.ascii "ebx: %dn"
output2:
.ascii "eax: %dn"
.section .text
.globl main
main:
movl $18,%eax
movl $11,%ebx
pushl %ebx
pushl $output1
call printf
addl $8,%esp
pushl %eax
pushl $output2
call printf
pushl $0
call exit