機械語
メモ
レジスタ
B80000
mov ax, 0
B80000 ← mov ax, 0
アセンブラ
B80000 → mov ax, 0
逆アセンブラ
リトルエンディアン
→主流
34 12
12 34
ビッグエンディアン
12 34
12 34
バイトごとにわけた状態がLEかBE
くっついている状態はなにでもない
x86
変数の数
16bit - 8
32bit - 8
64bit - 16
スマホ ARM
32bit - 16
レジスタ 変数
0 AX B8
1 CX B9
2 DX BA
3 BX BB
4 SP BC
5 BP BD
6 SI BE
7 DI BF
BB EF BE mov bx, beef
BF FE CA mov di, cafe
16 8
0 AX AH, AL
1 CX CH, CL
2 DX DH, DL
3 BX BH, BL
4 SP
5 BP
6 SI
7 DI
上 下
12 34
AH AL
high low
mov ax, 1234
mov ah, 56
mov al, 34
mov ah, 12
ax = 1234
AL
CL
DL
BL
AH
CH
DH
BH
16 8
0 AX AL
1 CX CL
2 DX DL
3 BX BL
4 SP AH
5 BP CH
6 SI DH
7 DI BH
B0 12 mov al, 12
B6 56 mov dh, 56
B0 xx mov al, xx
B1 xx mov cl, xx
B2 xx mov dl, xx
B3
B4
B5
B6
B7 xx mov bh, xx
mov = Move
Immediate to R
w = 1 word命令 16bit
w = 0 byte命令 8bit
1011 w reg | data | data if w = 1
8421
1011 w reg
↓
B 0 - F
w = 0 10110reg = B0 + r8
w = 1 10111reg = B8 + r16
PUSH
push si -> 0101 0110
5 6
16bit
0000 - FFFF
65536 64KB
push ss
17
XCHG = Exchange
R/M with R
R with A 10010reg
xchg r16, ax
xchg si, ax
xchg ax, si 1001 0110
9 6
MOVとかをニーモニック
xchg r16
ニーモニック オペランド
mov
immediate to register
ADD
immediate to Accmulater
add ax, 1234
mov ax, 1234
即値
0000010w
8
16
wは8bitのときと16bitのときがある
al
ax レジスタ番号0番
-
8のとき
add al, 56 -
16のとき
add ax, 1
add ax, 0001
add al, 001
wの指定がないときはデフォルトで1
INC
Register 01000reg
(w=1) 暗黙で16bit
inc bp
01000 101
0100 0101
4 5
mod r/mの話
PUSH FF 2 3 3
R/M 11111111 mod 110 r/m
mode レジスタまたはメモリ
モード アールエム
命令によって違う
mod r/m 1つのオペランド
push mod r/m
call
11111111 mod011r/m
011はどの命令か表す部分
メモリの話
レジスタ メモリ 1MB
Ax 0
Cx 1
2
3
C7 06 34 12 78 56
mov word [1234], 5678
16bit
mov byte [1234]
mov word [1234], 0056 16bit
C6 06 34 12 56
C7 11000111
immediate to Register
06 w
00 000 110
mod r/m
C7 06 34 12 78 56
mov word [1234] 5678
↓ 割り込まれる
1100011w mod000r/m data data if w = 1
mov word[1234], 5678
mov bx, 1234
mov word [bx], 5678 → C7 07 78 56
mov word [bx+2], 5678 → C7 47 02 78 56
ディスプレイスメント -> DISP
07
00 000 111
mod r/m
47
01 000 111
mod r/m
符号拡張
00 - FF
0 - 255
符号なし
00 - 7F 0 - 127
80 - FF -128 - -1
27 + 100 - 1
126
00 FF 00 FF
100
2の補数
符号のついてる数字のこと
FF -> 00FF ゼロ拡張
-1 255
FF -> FFFF 符号拡張
-1 -1
mod
mov word [bx], 5678 -> C7 07 78 56
mov word [bx+2], 5678 -> C7 47 02 78
r/m = 111 EA = (BX) + DISP
mod r/m
00 000 -> (BX) + (SI) + DISP -> [BX+SI+DISP]
00 001 -> [BX+DI+]
00 010 -> [BP+SI]
00 011 -> [BP+DI]
00 100 -> [SI]
00 101 -> [DI]
00 110 -> 例外 x [BP] -> [アドレス]
00 111 -> [BX]
mov word [bp], 1234
mov word [bp+0], 1234
↑
mod = 01
練習問題
ハンドアセンブル
1 mov byte [bp+si], 56
mod000r/m
1100 0110 0000 0010 0101 0110
C6 02 56
2 mov word [di], 1234
11000111 00 000 101 0011 0100 0001 0010
C7 05 34 12
3 mov ds, ax
register/memory to segment register
10001110 1101 1000
8E 0 8
1101 1000
0 8
mod 0 reg r/m
1101 1000
11 と 000 がax
mod 0 reg r/m
4 mov [bx+si], es
es が SR to R/M
10001100 0000 0000
8C 00
mod r/mがセット
mod 0 reg r/m
00 000 00
register/memory to/from register
mov [bx], ax 8907 from 10001001
mov ax, [bx] 8B07 to 10001011
axがwordなのは自明
d=1 to reg
d=0 from reg
d=0 mod r/m, reg
d=1 reg, mod r/m
swをどう見分けるか
nasm アセンブラ
ndisasm 逆アセンブラ
01
10
11
mov ax, es
8C CO
10001100
11000000
8D 00 8D 38 8D 06 34 12 8D C0 8C C0 8D FF
$ ndisasm test
00000000 8D00 lea ax,[bx+si]
00000002 8D38 lea di,[bx+si]
00000004 8D063412 lea ax,[0x1234]
00000008 8D db 0x8D
00000009 C0 db 0xC0
0000000A 8CC0 mov ax,es
8C
sbyte bin.[〜]
let c = (nint 16 a)|||(nint 16 b) <<< 8) |> int16
abs絶対値がとれる
abs(int(sbyte))
8C 08 8D 00 8D 38
+1 -> +0
-1 -> -0x1
8D 00 8D 38 8D 80 FF FF 8C C0 8C C7
8D 00 8D 38 8D 06 34 12 8D 40 01 8D 40 FF 8D 80
01 00 8D 80 FF FF 8C C0 8C C7 8C E7 8C 00 8C 04
8D 80 FF FF