gpt4 book ai didi

linux - 在 Linux 上使用 x86 汇编和 at&t 打印计数器 0 --> 4

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:19 24 4
gpt4 key购买 nike

我想打印一个循环的计数器 (0 --> 4)。在下面的代码中,diff 是 '0' 字符的 ASCII 数字,循环重复的最大次数,计数计数器和 p 是包含该字符的变量。

.data

.text

.global main

diff = 48
max = 5

count: .byte 0
p: .long 0

main:

compare:
cmpb $max,count # if counter is equal or above max
jae end # jump to end

movl $4,%eax # write
movl $1,%ebx # stdout
xor %ecx,%ecx # reset ecx
addb $diff,%cl # add ASCII number of '0'
addb count,%cl # add value of counter
movb %cl,p # move ASCII value of the counter
movl $p,%ecx # move the number to third argument of write
movl $4,%edx # size of long
int $0x80 # interrupt

movb count,%al # move value of the counter to al
inc %al # increment al
movb %al,count # move value of al to counter
jmp compare # always jump to compare

end:
movl $1,%eax # exit
movl $0,%ebx # exit(0)
int $0x80 # interrupt

这是行不通的。 gcc 不会给我错误,但执行它会给出核心转储。为什么?

最佳答案

您的变量 countp 是在 .text 指令之后定义的,这意味着它们在 text 部分。此部分应该用于代码并且是只读的。因此,尝试写入这些位置会导致段错误。

您可能想在 .data 指令之后定义它们。

修复此问题后,程序看起来可以运行,但实际上还有另一个错误。在每次循环迭代中,您使用 4 个字节调用 write,一个完整的 long。高位字节为 0。因此,不是写入一个字节,ascii 0 (0x30),而是写入 4 个字节 (0x30 0x00 0x00 0x00)。您的程序总共输出 20 个字节而不是 5 个字节。

你可能只想写一个字节。在这种情况下,您可能希望在调用 write 时将 %edx 设置为 1。在这种情况下,p 可以只是一个 .byte 而不是 .long

顺便说一下,如果您在调试器(例如 gdb)下运行它,您会立即看到哪条指令出错了。如果你没有这样做,你应该!了解如何使用调试器对于使用任何语言的程序员来说都是必不可少的,尤其是汇编语言。

如果您这样做了,那么最好在您的问题中包含这些信息。

关于linux - 在 Linux 上使用 x86 汇编和 at&t 打印计数器 0 --> 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35105249/

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