assembly 分段故障NASM汇编64位[重复]

xmakbtuz  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(135)
    • 此问题在此处已有答案**:

Assembly compiled executable using INT 0x80 on Ubuntu on Windows Subsystem for Linux doesn't produce output(2个答案)
What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?(1个答案)
2天前关闭。
我目前正在学习计算机体系结构,其中一个核心主题是汇编程序。由于某种原因,教授的示例代码在我的计算机上不起作用。我使用的是64位Linux子系统for Windows来汇编、编译、调试和执行代码。下面是示例:

section .data

msg: db "Hello world!", 0x0a
errmsg: db "Error!", 0x0a

section .bss

buf1: resb 40
buf2: resb 20

section .text
global _start

write_msg:
mov eax, 4 ; write syscall
mov ebx, 1 ; to stdout
mov ecx, msg ; buffer to write
mov edx, 13 ; number of bytes to write
int 80h ; kernel interrupt
ret

_start:
call write_msg
mov eax, 1 ; exit syscall
mov ebx, 0 ; exit code 0
int 80h ; kernel interrupt

我正在组装、编译和执行代码,如下所示:

nasm -g -f elf64 helloworld.asm
ld -m elf_x86_64 -static -o helloworld helloworld.o
./helloworld

这样做时,我只会收到错误消息:

Segmentation fault (core dumped)

然后我试着用GDB调试它以找出错误的原因(尽管这个例子是我们的教授给我们的,而且它在朋友的电脑上运行得非常好):

gdb helloworld

set disassembly-flavor intel

break *write_msg+1

run

我还收到一条错误消息,内容如下:

warning: opening /proc/PID/mem file for lwp 223.223 failed: No such file or directory
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x401001

我已经在谷歌上搜索,试图找到一些解释和修复这个错误的东西,但我找不到任何东西。
我们会很感激的。

kyks70gy

kyks70gy1#

目前WSL只有64位,32位代码根本不起作用。其次,在64位模式下,您应该使用64位寄存器和syscall而不是int 0x80。如果您想使用32位程序,请升级到WSL2。

相关问题