1

我是使用汇编代码编程的硬件新手。所以我读了一本关于它的书,找到了 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

汇编程序没有问题,可以汇编它并且没有错误,但是程序立即崩溃。我读到了不同的汇编语言,但关键是汇编代码随不同的编译器而不是不同的操作系统而变化,那么我的错误在哪里?

4

2 回答 2

3

您显示的代码是 x86_32 linux 代码。
你可以说出来,因为它使用int了 Windows 没有的调用以及这一行:

nasm -f elf64 helloworld.asm

以ELF格式生成输出,这是一个 linux 可执行文件。
Windows 使用 PE (便携式可执行文件) ,它是COFF的 MS EEE变体。

x64 代码使用RAX, RBX....,虽然 32 位变体寄存器EAX等也有很多功能。

在您可以学习如何编写汇编之前。
您需要了解系统的 ABI(调用约定)和 API。

对于 ABI,请查看:调用约定 - PDF

如果您想知道如何在 Windows 中进行 API 调用,请编写一个简单的 C 程序来完成这项工作,然后获取一个反汇编程序并查看 x86 代码。
有关 API 调用的更多信息,请查看 MSDN,特别是:

x64 调用约定概述
Windows 控制台函数
ExitProcess 函数

于 2013-10-16T02:03:36.640 回答
1

以 PE 格式组装您的可执行文件并将其更改int 0x80call ExecuteInterrupt128. 你可以给它一个相同的名字。您可以学习如何在 NASM 上编写 PE 可执行文件。只需转到 Stack Overflow 的主页。

ExecuteInterrupt128 函数必须如下所示:

push ebp
mov ebp, esp
cmp eax, byte +1
je SleepSystem
cmp eax, byte +4
je PrintString
...
SleepSystem:
push byte -1
call Sleep
leave
ret
PrintString:
push -11
call GetStdHandle
push byte +0
push byte +6
lea esi, [ebp-4]
push edx
push ecx
push eax
call WriteConsoleA
leave
ret

或者试试这个命令:

    nasm -f win32 -o executable.o executable.asm
    ld -o executable.exe executable.o
于 2013-10-16T13:26:56.177 回答