gpt4 book ai didi

linux - AT&T 汇编尝试将 "movb"一个字符常量注册,核心转储

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

我正在使用 ubuntu64 + gas我使用 AT&T 汇编,我试图给 al 寄存器分配一个 'e',然后编译成 32 位程序

$猫c2.s

.code32 
.globl _start
_start:
movb 'e',%al # Problem here!!!!
mov $1,%eax
mov $0,%ebx
int $0x80

$ as -g c2.s -o c2.o && ld c2.o -o c2

$ c2

Segmentation fault(SIGSEGV)

我用gdb调试c2,发现它在movb 'e',%al处崩溃。太奇怪了,“movb”怎么会崩溃?

然后我将我的语法切换为使用英特尔相同的内容:

$猫b2.s

.intel_syntax noprefix 
.code32
.section .text
.global _start
_start:
mov al,'e'
mov eax,1
mov ebx,0
int 0x80

$ as -g b2.s -o b2.o && ld b2.o -o b2

$ b2

这次没问题。但是,为什么,我对 AT&T 汇编的使用有问题?

最佳答案

是不是很有趣。 AS 为 AT&T 语法生成此目标代码

  400078:   a0 65 00 00 00 b8 01    movabs 0x1b800000065,%al
40007f: 00 00
400081: 00 bb 00 00 00 00 add %bh,0x0(%rbx)
400087: cd 80 int $0x80

很明显,位置 0x1b800000065 没有映射,但是 Intel;

  400078:   b0 65                   mov    $0x65,%al
40007a: b8 01 00 00 00 mov $0x1,%eax
40007f: bb 00 00 00 00 mov $0x0,%ebx
400084: cd 80 int $0x80

从 AT&T 中删除 .code32 即可。

  400078:   8a 04 25 65 00 00 00    mov    0x65,%al
40007f: b8 01 00 00 00 mov $0x1,%eax
400084: bb 00 00 00 00 mov $0x0,%ebx
400089: cd 80 int $0x80

注意它是如何将内存位置 0x64 的内容移动到 AL 中的。

movb   $'e',%al

解决了这个问题。无论如何,在 64 位系统上开发 32 位代码可能会在某个时候让您感到悲伤,尤其是当您开始处理堆栈时。

关于linux - AT&T 汇编尝试将 "movb"一个字符常量注册,核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39721738/

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