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 コードです。Windows が使用しない呼び出しと次の行を
使用するため、わかります。int

nasm -f elf64 helloworld.asm

Linux 実行可能ファイルであるELF形式で出力を生成します。Windows は、 COFFの MS EEEバリアントである
PE (ポータブル実行可能ファイル)を使用します。

x64 コードではRAX, RBX.... を使用しますが、32 ビット バリアント レジスタEAXなども多くの機能を備えています。

アセンブリの書き方を学ぶ前に。
ABI (呼び出し規約) とシステムの API を知る必要があります。

ABI については、Calling Conventions - PDF をご覧ください。

Windows で API 呼び出しを行う方法を知りたい場合は、ジョブを実行する単純な C プログラムを作成し、逆アセンブラーを取得して x86 コードを調べます。
API 呼び出しの詳細については、具体的には MSDN を参照してください。

x64 呼び出し規則の概要
Windows コンソール関数
ExitProcess 関数

于 2013-10-16T02:03:36.640 に答える
1

実行可能ファイルを PE 形式でアセンブルint 0x80し、 をcall 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 に答える