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セグメントの組合せであってもよいセグメントからなり、まず、データセグメントに注目し、以下の例がある.
このコードの意味ははっきりしているようですが、equ、dbはどういう意味ですか.実際にNASMはいくつかの擬似命令をサポートしています. DB、DW、DD、DQ、DT、DO、DY、DZ-初期化されたデータを生成するために使用する、例えば、 . RESB,RESW,RESD,RESQ,REST,RESO,RESY,RESZ-初期化されていない変数を宣言するために使用されます. INCBIN-外部バイナリファイルをインポートします. EQU- などの静的変数を定義します. TIMES-命令またはデータを繰り返します.
ADD-整数加算 SUB-減算 MUL-符号なし乗算 IMUL-符号付き乗算 DIV-符号なし除算 IDIV-符号付き除算 INC-プラス1 DEC-マイナス1 NEG-負
cmp命令は2つの値間の比較を実行するために使用され、この命令は条件ジャンプに使用される.
cmp命令は2つの値を比較するだけで、副作用はなく、比較結果に基づいて何の操作も実行されません.比較後の操作については、次の条件付きジャンプ命令があります. JE-等しい場合 JZ-0 の場合 JNE-等しくなければ JNZ-0でない場合 JG-1番目の数が2番目の数より大きい場合 JGE-以上 JA-はJGと似ていますが、符号なし に対してです. JAE-およびJGE、ただし符号なしタイプ たとえば、Cのif/else文は次のように宣言されます.
アセンブリでは、次のようになります.
ここにも無条件ジャンプがあります.
具体例:
用語と概念
多くの読者から要望を受け、最初の文章がはっきりしていないというので、本文と後でこの部分を補充します.レジスタ-レジスタは、プロセッサ内部の少量のストレージです.プロセッサの重点はデータの処理です.プロセッサはメモリから直接データを取得できますが、操作速度が遅いです.したがって、プロセッサは、内部の制限された数のデータストレージ、すなわちレジスタを有する.小端記憶-小端記憶は最低有効バイトのアドレスが最小である.大端ストレージ-大端ストレージと小端ストレージは逆です.≪システム・コール|System Call|emdw≫:ユーザー・レベルのプログラムがオペレーティング・システムにいくつかの操作を実行するように要求する方法です.システムテーブルから見ることができます.スタック-プロセッサには制限された数のレジスタしかありません.スタックは、RSP、SS、RIPなどのメモリアドレッシング専用レジスタの連続領域である.≪セグメント|Segments|Eas≫-各アセンブリはセグメントで構成されます.次のセクションがあります.
通常、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はいくつかの擬似命令をサポートしています.
;; Initialize 4 bytes 1h, 2h, 3h, 4h
db 0x01,0x02,0x03,0x04
;; Initialize word to 0x12 0x34
dw 0x1234
;; now one is 1
one equ 1
さんじゅつそうさ
せいぎょりゅう
cmp命令は2つの値間の比較を実行するために使用され、この命令は条件ジャンプに使用される.
;; compare rax with 50
cmp rax, 50
cmp命令は2つの値を比較するだけで、副作用はなく、比較結果に基づいて何の操作も実行されません.比較後の操作については、次の条件付きジャンプ命令があります.
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