c - AT&T 汇编 + C 函数。使用 Scanf 进行字符串输入

标签 c function assembly scanf

我正在尝试在汇编中使用 scanf 来获取输入。 据我所知,我必须以相反的顺序压入函数的堆栈参数,然后调用函数。它与 printf 函数一起工作正常,但与 scanf 和输入位置不太正确。 Scanf 应该有 2 个参数。第一个是输入类型(字符串、整数、字符等),第二个是放置它的地址。

scanf(„%s” , buffer)

我认为这是我们的目标。 我的代码:

.data 

name: .ascii "What is your name?\n"
name2: .ascii "Your name is:"
formatScanf: .ascii "%s"
.bss
buffer: .size 100 #100 bytes for string input

.text 
.globl main 
main: 

#Printing question #works fine
pushl $name       
call printf 

#Get answers
push $buffer    #2nd argument for scanf
push $formatScanf #1st argument of scanf
call scanf



#Exiting
pushl $0 
call exit 

错误信息:

lab3.s: Assembler messages:
lab3.s:8: Error: expected comma after name `' in .size directive

作为编译器,我将 gcc 与:“gcc -m32 Program.s -o run”命令一起使用,以获得 32 位处理器工作类型,并自动链接 C 库。

它有什么问题? 我应该如何在 asm 中使用 scanf?

编辑: 我应该使用 .space 而不是 .size 或 .size 缓冲区,100 它现在编译。

编辑 2: 使用 SCANF C 函数的完整代码

#printf proba
.data 


name2: .string "Your name is: %s "
formatScanf: .string "%s"
name: .string "What is your name?\n"
.bss
buffer: .space 100

.text 
.globl main 
main: 

#Printing question #works fine
pushl $name       
call printf 

#Get answers
push $buffer    #2nd argument for scanf
push $formatScanf #1st argument of scanf
call scanf

push $buffer
push $name2
call printf

#Exiting
pushl $0 
call exit 

最佳答案

在 GNU 汇编器中,.size 指令指定符号的大小。这仅用于非正式目的,对程序没有任何影响。最重要的是,它没有指定缓冲区或变量或其他任何内容的大小。

在 GNU 汇编器中,没有可变大小或类似的概念。要创建所需长度的缓冲区,请组装所需数量的空白字节并在前面添加一个标签,如下所示:

buffer: .space 100

.space 指令将给定数量的 NUL 字节组装到对象中。或者,您之后应该为 buffer 设置符号大小,以便 nm -S 的输出有意义:

.size buffer, 100

保留它不会对您造成伤害,但是 nm -S 将不会显示您的符号的大小数据,这样做可能会降低某些调试实用程序的效率。

关于c - AT&T 汇编 + C 函数。使用 Scanf 进行字符串输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49860750/

相关文章:

c++ - 我的递归函数没有返回正确的值

R:在循环中定义函数

assembly - 初学者裸机pdp11控制台输出

c - C语言嵌入ARM汇编

c - 使用 zlib 编译 c 代码的正确标志是什么

c++ - 如何使用主参数添加更多堆栈?

r - 如何使循环函数将其结果输出为R中的数据帧

assembly - aarch64 中的零寄存器 0x​​104567910 本质上是接地的吗?

c - 了解在堆栈中执行 C 代码(Mac 黑客手册代码)

c - C代码中的特殊字符