- 此问题在此处已有答案**:
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
我已经在谷歌上搜索,试图找到一些解释和修复这个错误的东西,但我找不到任何东西。
我们会很感激的。
1条答案
按热度按时间kyks70gy1#
目前WSL只有64位,32位代码根本不起作用。其次,在64位模式下,您应该使用64位寄存器和
syscall
而不是int 0x80
。如果您想使用32位程序,请升级到WSL2。