首页 > 解决方案 > 直接在汇编中使用 stdlib.h 函数

问题描述

我必须做一个汇编 (x86) 程序,它从用户输入中获取 2 个长数字,使用函数添加它们,然后打印结果。当我使用 read 系统调用时,我得到一个 ASCII 十六进制代码的字符串,我无法添加这样的数字。所以我想使用atol,它是stdlib.h 的一个函数,将字符串转换为long。如何在程序集中包含库?还有另一种方法可以做到这一点吗?

我已经尝试过:

  1. .file "stdlib.h"(我在当前目录中有lib)

错误:未定义的引用atol'

  1. 使用 clang 将 stdlib.h 与 .s 文件一起编译

错误:stdlib.h:文件无法识别:文件格式无法识别

  1. 用 only 制作一个 .c 文件#include<stdlib.h>并用 .s 文件编译它

错误:未定义对“atol”的引用

我运行的 comads 是

clang function.s -c -g
ld function.o -o function

标签: clinuxassemblyclangx86-64

解决方案


链接器抱怨atol没有找到,因为它是 C 库中的一个函数,但是您没有告诉链接器在链接期间将 C 库添加到您的程序中。要解决此问题,-lc请在链接期间传递给链接器以添加 C 库:

ld -o function function.o -lc

最后一个非常重要-lc,否则链接可能不起作用。这是因为链接器按照您指定的顺序从库中选择函数。当您指定-lcbeforefunction.o时,它​​会忽略该库,因为它现在不需要任何内容​​。然后它看到function.o一个未定义的atol并且没有找到定义,导致链接失败。

最后,当您使用 C 库时,您应该像普通 C 程序一样从main函数启动程序(即重命名_start为)并通过 C 编译器链接:main

clang -g -o function function.s

这会导致 C 库自动链接并正确初始化它,从而防止一些奇怪的错误。如果您使用printfC 库中的任何 IO 函数,您还应该通过调用来结束您的程序,exit以便正确刷新标准 IO 流。

请注意,该stdlib.h文件是一个红鲱鱼。汇编编程不需要头文件。它们的目的是告诉 C 编译器某些函数的类型是什么。如果您不使用 C 编译器,则不需要这样做。该.file指令没有按照您的预期执行。


推荐阅读