機械語

# 機械語

メモ

## レジスタ

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 １つのオペランド

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