c - 直接在汇编中使用 stdlib.h 函数
问题描述
我必须做一个汇编 (x86) 程序,它从用户输入中获取 2 个长数字,使用函数添加它们,然后打印结果。当我使用 read 系统调用时,我得到一个 ASCII 十六进制代码的字符串,我无法添加这样的数字。所以我想使用atol,它是stdlib.h 的一个函数,将字符串转换为long。如何在程序集中包含库?还有另一种方法可以做到这一点吗?
我已经尝试过:
.file "stdlib.h"
(我在当前目录中有lib)
错误:未定义的引用atol'
- 使用 clang 将 stdlib.h 与 .s 文件一起编译
错误:stdlib.h:文件无法识别:文件格式无法识别
- 用 only 制作一个 .c 文件
#include<stdlib.h>
并用 .s 文件编译它
错误:未定义对“atol”的引用
我运行的 comads 是
clang function.s -c -g
ld function.o -o function
解决方案
链接器抱怨atol
没有找到,因为它是 C 库中的一个函数,但是您没有告诉链接器在链接期间将 C 库添加到您的程序中。要解决此问题,-lc
请在链接期间传递给链接器以添加 C 库:
ld -o function function.o -lc
最后一个非常重要-lc
,否则链接可能不起作用。这是因为链接器按照您指定的顺序从库中选择函数。当您指定-lc
beforefunction.o
时,它会忽略该库,因为它现在不需要任何内容。然后它看到function.o
一个未定义的atol
并且没有找到定义,导致链接失败。
最后,当您使用 C 库时,您应该像普通 C 程序一样从main
函数启动程序(即重命名_start
为)并通过 C 编译器链接:main
clang -g -o function function.s
这会导致 C 库自动链接并正确初始化它,从而防止一些奇怪的错误。如果您使用printf
C 库中的任何 IO 函数,您还应该通过调用来结束您的程序,exit
以便正确刷新标准 IO 流。
请注意,该stdlib.h
文件是一个红鲱鱼。汇编编程不需要头文件。它们的目的是告诉 C 编译器某些函数的类型是什么。如果您不使用 C 编译器,则不需要这样做。该.file
指令没有按照您的预期执行。
推荐阅读
- node.js - NodeJs Mongoose 和 Chai/Mocha
- python-sphinx - RST Sphinx - 添加超链接到内部图像
- kubernetes - kubectl 的 Ansible 命令获取 openshiftapiserver
- javascript - How to apply isPointInPath() to multiple path
- google-compute-engine - 发生内部错误错误代码 0x4 远程桌面连接到谷歌云计算引擎 VM
- c# - TcpClient.BeginRead 工作一次
- javascript - 如何仅在挂载时调用 api 并单击 Fetch Next User 按钮
- r - 如何根据条件计算每行的 NA 数量
- python - 数据框在 concat 后表现不同
- python - stl_writer.Write 不保存任何文件