gpt4 book ai didi

c - 在汇编中添加两个数字

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:33 24 4
gpt4 key购买 nike

我刚刚开始使用汇编,我想创建一个简单的程序来添加两个数字并打印结果

这是我目前所拥有的:

.globl main
.type main, @function
main:
movl $14, %eax
movl $10, %ebx
add %eax, %ebx
call printf

根据我的理解,这是逐行发生的事情

第 1 行:我正在创建一个可以被链接器访问的标签 main

第 2 行:我正在为函数指定标签 main 的类型

第 3 行:我开始定义 main

第 4 行:我将数值 14 存储到通用寄存器 eax 中

第 5 行:我将数值 10 存储到通用寄存器 ebx 中

第 6 行:我将 eax 和 ebx 的值相加并将结果存储在 ebx 中

第 7 行:我调用函数 printf(这是我感到困惑的地方)

如何指定打印寄存器的值?

另外,我该如何完成这个程序?当前运行时,程序会导致段错误。

最佳答案

SECTION .data

extern printf
global main

fmt:
db "%d", 10, 0

SECTION .text

main:
mov eax, 14
mov ebx, 10
add eax, ebx

push eax
push fmt
call printf

mov eax, 1
int 0x80

很遗憾,我不知道您使用的是哪种编译器/汇编器,而且我也不熟悉 at&t 语法,因此我为您提供了一个适用于 Nasm 的英特尔风格 x86 的工作示例。

$ nasm -f elf32 test.s -o test.o
$ gcc test.o -m32 -o test
$ ./test
24

为了使用 printf,您需要实际将它的参数压入堆栈,我在这里以相反的顺序执行此操作(首先压入最后一个参数):

push    eax
push fmt

EAX 包含添加 eax、ebx 的结果,标签 'fmt' 是一个字符数组:“%d\n\0”(%d 格式、换行符、空终止符)。

在调用 printf 之后,您需要使用 exit 系统调用实际退出您的程序,否则(至少对我而言)程序将在 printf 之后发生段错误,即使它可以运行,您也看不到结果。

所以这两行:

mov    eax, 1
int 0x80

通过将 x86 上的退出序号 (1) 放入 EAX 来执行 sys_exit 系统调用,然后调用中断 0x80,这会干净地退出程序。

关于c - 在汇编中添加两个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51433054/

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