【发布时间】:2022-01-15 10:44:52
【问题描述】:
谁知道打印顺序错误的根本原因? 如何解决? 我将以下代码编译为汇编:
{
int a, b;
sprint("input number\n");
scan (a);
iprint(a);
}
这生成了以下汇编代码:
IO:
.string "%lld\n"
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
.data
L1: .string "input number"
.text
leaq L1(%rip), %rcx
movq $0, %rax
subq $32, %rsp
callq printf <-------printf
addq $32, %rsp
movq %rbp, %rax
leaq -8(%rax), %rax
movq %rax, %rdx
leaq IO(%rip), %rcx
subq $32, %rsp
callq scanf <---------scanf
addq $32, %rsp
movq %rbp, %rax
leaq -8(%rax), %rax
movq (%rax), %rax
pushq %rax
popq %rdx
leaq IO(%rip), %rcx
subq $32, %rsp
callq printf <--------printf
addq $32, %rsp
leaveq
retq
我在windows 7上安装了Embarcadero-dev-cpp,使用gcc tmp.s得到一个执行文件a.exe,然后运行a.exe
$ ./a.exe
987 <-----my input, should be the second display
input number <-------should be print firstly
987 <-------the last.
jason@jason-PC ~/samplecygwin
$
printf、scanf的阳离子顺序不对。
我的高级语言代码被翻译成汇编代码。 我应该在编译器中的 printf 之后插入 flush(stdout) 吗? 谢谢你。 这是一个常见的问题,但很少遇到,请参考以下内容。
【问题讨论】:
-
sprint、scan和iprint的定义是什么? -
我认为您没有编写编译器。您可能编写了一个程序并编译了它;-)。顺便说一句,看到一个完整的程序对我们总是有帮助的,最好归结为一个最小的例子。
-
@Peter-ReinstateMonica:在call scanf system subroutine to input a integer number but error in the execute 中,询问者说他们的教授 编写了一个编译器,ed.tus.ac.jp/j-mune/ccp。这种极度臃肿的 asm 用玩具编译器比手写更容易解释,例如
movq %rbp, %rax/leaq -8(%rax), %rax/movq %rax, %rdx而不是lea -8(%rbp), %rdx
标签: assembly output printf scanf