【发布时间】:2013-10-21 04:44:00
【问题描述】:
我是使用汇编代码编程的硬件新手。所以我读了一本关于它的书,发现了这个 NASM 汇编器的示例代码:
segment .text ;code segment
global main ;must be declared for linker
main: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
segment .data ;data segment
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
所以我用以下命令编译它:
nasm -f elf64 helloworld.asm
ld -s -o helloworld.exe helloworld.o
汇编程序没有问题,可以汇编它并且没有错误,但是程序立即崩溃。我读到了不同的汇编语言,但重点是汇编代码会随着不同的编译器而不是不同的操作系统而变化,那么我的错误在哪里?
【问题讨论】:
-
你为什么认为问题出在操作系统上。如果运行 Windows 7,它可能会在同一台机器上崩溃。你测试过那个场景吗?如果不是操作系统,那就离开机器。
-
对于任何 x64 操作系统,我都会先尝试
mov rcx, msg(我也怀疑 Win 8 使用 linux 风格的系统调用。Windows 7 没有。) -
在 Windows 上,您从 system32.dll 调用 ExitProcess 以退出。系统调用非常特定于操作系统。
-
您正在尝试在 Windows 中执行 Linux 系统调用,但这是行不通的。请改用
WriteConsole和ExitProcess等 WinAPI 函数。
标签: windows assembly x86-64 nasm