gpt4 book ai didi

c - 32b x86 程序集 scanf 用法

转载 作者:行者123 更新时间:2023-12-02 09:29:41 24 4
gpt4 key购买 nike

因此,我尝试在 32 位 ATT 汇编中使用 scanf 函数,并不断出现段错误,尽管使用与计算机系统:程序员的示例中所示的代码几乎相同的代码透视图 以及从我自己的简单 C 输入程序生成的程序集。我不知道我做错了什么,希望得到一些帮助来解决这个问题。

我的测试汇编代码(有段错误):

    .data
.align 4
fmt: .string "%d"
str: .string "Input a number: "
.text

.global main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp

subl $40, %esp

movl $str, (%esp)
call printf

leal 36(%esp), %eax
movl %eax, 4(%esp)
movl $fmt, (%esp)
call scanf

pushl -4(%ebp)
call printf

movl %ebp, %esp
popl %ebp
ret

C 代码及其汇编:

C:

#include <stdio.h>

int main()
{
int i, j;
printf("%s\n","Enter 2 numbers:");
scanf("%d %d",&i,&j);
printf("i = %d and j = %d\n",i,j);
return 0;
}

组装:

    .file   "scan.c"
.section .rodata
.LC0:
.string "Enter 2 numbers:"
.LC1:
.string "%d %d"
.LC2:
.string "i = %d and j = %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
movl $.LC0, (%esp)
call puts
leal 28(%esp), %eax
movl %eax, 8(%esp)
leal 24(%esp), %eax
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call __isoc99_scanf
movl 28(%esp), %edx
movl 24(%esp), %eax
movl %edx, 8(%esp)
movl %eax, 4(%esp)
movl $.LC2, (%esp)
call printf
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section .note.GNU-stack,"",@progbits

书中的示例(裁剪后的屏幕截图):http://i.imgur.com/zYaHZP5.jpg

最佳答案

您只是忘记了 printf 的格式字符串。您实际上是执行 printf(i) 而不是 printf("%d", i)。因此改变:

pushl   -4(%ebp)
call printf

致:

pushl   -4(%ebp)
pushl $fmt
call printf

PS:学习使用调试器。

关于c - 32b x86 程序集 scanf 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34444366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com