1. ホーム
  2. winapi

[解決済み] WindowsでアセンブラでHello Worldを書くには?

2022-11-28 07:53:51

質問

Windowsでアセンブリの基本的なものを書きたく、NASMを使っているのですが、何も動作させることができません。

WindowsでC関数の助けを借りずにhello worldを書き、コンパイルするにはどうしたらよいでしょうか?

どのように解決するのですか?

NASMの例 .

libc stdioの呼び出し printf を実装しています。 int main(){ return printf(message); }

; ----------------------------------------------------------------------------
; helloworld.asm
;
; This is a Win32 console program that writes "Hello, World" on one line and
; then exits.  It needs to be linked with a C library.
; ----------------------------------------------------------------------------

    global  _main
    extern  _printf

    section .text
_main:
    push    message
    call    _printf
    add     esp, 4
    ret
message:
    db  'Hello, World', 10, 0

次に

nasm -fwin32 helloworld.asm
gcc helloworld.obj
a


また NasmでHello Worldを作るための無知な初心者向けガイド をCライブラリを使用せずに作成することもできます。そうすると、コードはこのようになります。

MS-DOS システム コールを使用した 16 ビット コード: DOS エミュレーターまたは NTVDM サポートのある 32 ビット Windows で動作します。 . x86-64 カーネルは vm86 モードを使用できないため、任意の 64 ビット Windows 上で "直接"(透過的に) 実行することはできません。

org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, World!',0Dh,0Ah,'$'

これを .com でロードされるように、実行形式を cs:100h にロードされ、すべてのセグメントレジスタが互いに等しくなります (小さなメモリモデル)。

がんばってください。