LoginSignup
5
5

More than 5 years have passed since last update.

機械語

Last updated at Posted at 2014-07-05

機械語

メモ

レジスタ

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5