x 86_へ64アセンブリHello[第2部]

3908 ワード

原文はpart 2を参照

用語と概念


多くの読者から要望を受け、最初の文章がはっきりしていないというので、本文と後でこの部分を補充します.レジスタ-レジスタは、プロセッサ内部の少量のストレージです.プロセッサの重点はデータの処理です.プロセッサはメモリから直接データを取得できますが、操作速度が遅いです.したがって、プロセッサは、内部の制限された数のデータストレージ、すなわちレジスタを有する.小端記憶-小端記憶は最低有効バイトのアドレスが最小である.大端ストレージ-大端ストレージと小端ストレージは逆です.≪システム・コール|System Call|emdw≫:ユーザー・レベルのプログラムがオペレーティング・システムにいくつかの操作を実行するように要求する方法です.システムテーブルから見ることができます.スタック-プロセッサには制限された数のレジスタしかありません.スタックは、RSP、SS、RIPなどのメモリアドレッシング専用レジスタの連続領域である.≪セグメント|Segments|Eas≫-各アセンブリはセグメントで構成されます.次のセクションがあります.
  • data-初期化された変数または静的変数を生成するために使用されます.
  • bss-生命の初期化されていない変数に使用されます.
  • text-コード

  • 通常、16個の汎用レジスタ-rax,rbx,rcx,rbp,rsp,rsi,rdi,r 8,r 9,r 10,r 11,r 12,r 13,r 14,r 15がある.もちろん、プログラミングに関連する用語と概念の完全なリストをアセンブリします.以下で不慣れな用語に遭遇した場合、関連概念を説明します.

    データ型


    ベースのデータ型はバイト(bytes),ワード(words),ダブルワード(doublewords),四ワード(quadwords),ダブルワードである.1 byteは8 bits、1字は2 bytes、2字は4 bytes、..現在、本文は整型にのみ関与しており、整型は2つに分けられている:無記号整型と有記号整型.符号なしダブルワード整数範囲は0 to 2^32–1、符号付きダブルワード整数は–2^31 to+2^31–1...

    セグメント


    前述したように、各アセンブリプログラムは、データセグメント、テキストセグメント、BSSセグメントの組合せであってもよいセグメントからなり、まず、データセグメントに注目し、以下の例がある.
    section .data
        num1:   equ 100
        num2:   equ 50
        msg:    db "Sum is correct", 10
    

    このコードの意味ははっきりしているようですが、equ、dbはどういう意味ですか.実際にNASMはいくつかの擬似命令をサポートしています.
  • DB、DW、DD、DQ、DT、DO、DY、DZ-初期化されたデータを生成するために使用する、例えば、
  • .
    ;; Initialize 4 bytes 1h, 2h, 3h, 4h
    db 0x01,0x02,0x03,0x04
    
    ;; Initialize word to 0x12 0x34
    dw    0x1234
    
  • RESB,RESW,RESD,RESQ,REST,RESO,RESY,RESZ-初期化されていない変数を宣言するために使用されます.
  • INCBIN-外部バイナリファイルをインポートします.
  • EQU-
  • などの静的変数を定義します.
    ;; now one is 1
    one equ 1
    
  • TIMES-命令またはデータを繰り返します.

  • さんじゅつそうさ

  • ADD-整数加算
  • SUB-減算
  • MUL-符号なし乗算
  • IMUL-符号付き乗算
  • DIV-符号なし除算
  • IDIV-符号付き除算
  • INC-プラス1
  • DEC-マイナス1
  • NEG-負
  • せいぎょりゅう


    cmp命令は2つの値間の比較を実行するために使用され、この命令は条件ジャンプに使用される.
    ;; compare rax with 50
    cmp rax, 50
    

    cmp命令は2つの値を比較するだけで、副作用はなく、比較結果に基づいて何の操作も実行されません.比較後の操作については、次の条件付きジャンプ命令があります.
  • JE-等しい場合
  • JZ-0
  • の場合
  • JNE-等しくなければ
  • JNZ-0でない場合
  • JG-1番目の数が2番目の数より大きい場合
  • JGE-以上
  • JA-はJGと似ていますが、符号なし
  • に対してです.
  • JAE-およびJGE、ただし符号なしタイプ
  • たとえば、Cのif/else文は次のように宣言されます.
    if (rax != 50) {
        exit();
    } else {
        right();
    }
    

    アセンブリでは、次のようになります.
    ;; compare rax with 50
    cmp rax, 50
    ;; perform .exit if rax is not equal 50
    jne .exit
    jmp .right
    

    ここにも無条件ジャンプがあります.
    JMP label
    

    具体例:
    _start:
        ;; ....
        ;; do something and jump to .exit label
        ;; ....
        jmp .exit
    
    .exit:
        mov    rax, 60
        mov    rdi, 0
        syscall
    

    section .data
        ; Define constants
        num1:   equ 100
        num2:   equ 50
        ; initialize message
        msg:    db "Sum is correct
    " section .text global _start ;; entry point _start: ; set num1's value to rax mov rax, num1 ; set num2's value to rbx mov rbx, num2 ; get sum of rax and rbx, and store it's value in rax add rax, rbx ; compare rax and 150 cmp rax, 150 ; go to .exit label if rax and 150 are not equal jne .exit ; go to .rightSum label if rax and 150 are equal jmp .rightSum ; Print message that sum is correct .rightSum: ;; write syscall mov rax, 1 ;; file descritor, standard output mov rdi, 1 ;; message address mov rsi, msg ;; length of message mov rdx, 15 ;; call write syscall syscall ; exit from program jmp .exit ; exit procedure .exit: ; exit syscall mov rax, 60 ; exit code mov rdi, 0 ; call exit syscall syscall