Upload
christopher-rodriguez
View
54
Download
0
Embed Size (px)
Citation preview
..
.. , .. , ..
"
"
(- )
1
2012
004.2+004.43(075.8)
32.973-0273
89
-
..
: C.. ,
.. ,
.. , .. , .. .
89 : -
. . .
.. ( 05899 24.09.2001); , 2012.
64 .
ISBN 978-5-89407-499-3
ISBN 978-5-317-04302-5
, , 1 1 2010-2012 . , , .
004.2+004.43(075.8)
32.973-0273
ISBN 978-5-89407-499-3
.. , 2012
ISBN 978-5-317-04302-5 .., .., .., 2012
3
............................................................................................................................. 5
1. .................................................................. 6
............................................................................................. 8
................................................................................. 9
...................................................................................................................... 10
.............................................................................................................. 11
1-1 ....................................................................... 11
...................................................................................... 12
....................................................................................................... 13
................................................................................................ 14
1-2 ........................................................... 15
1-3 ...................................................... 15
/ ............................................................................................... 17
1-4 Hello, World! ............................................................................................. 18
............................................................................................................................ 19
2. ......................................................... 23
............................................................ 23
2-1 ....................................... 23
2-2 ..................................................................................... 24
2-3 ............................................................. 25
2-4 ............................................................................................... 26
2-5 .................................................................................................... 27
............................................................................................................................ 28
3. ......................................................................... 31
................................................................................ 31
................................ 31
3-1 ................................................................... 32
3-2 ................................................... 32
3-3 .............................................................................. 34
3-4 .......................................................... 35
4
............................................................................................................................ 36
4. ...................................................................................... 39
4-1 ....................................... 40
4-2 ........................................ 41
............................................................................................................................ 43
5. ........................................................................ 48
5-1 .............................................................................. 48
5-2 .................................................................................. 49
5-3 ................................................................... 49
5-4 ...................................................... 50
5-5
............................................................................................................................ 51
............................................................................................................................ 51
6. ..................................................................................................... 54
........................................................................................................................ 62
5
, 1 1
. ,
: ,
, .
, .
,
,
.
,
1 ,
.
6
1. () , IA-32/Linux
IA-32/Windows, ,
(. 1).
,
.
8 (1 ), 0
232-1 ( ). 32-
, ,
, .
,
, .
1 - IA-32,
.
, ,
.
,
( ) .
; , ,
(. 2).
IA-32 ,
, ,
. ,
:
,
7
. ,
, ,
.
2 - .
,
.
.
. ()
.
.
, , ( ):
, , .
, ,
.
, , ..
.
() . IA-32
: AT&T Intel.
, .
NASM (Netwide Assembler),
, Microsoft
8
Windows UNIX-.
http://www.nasm.us/.
.asm. , ,
(
) .
, , (
):
, .text;
( , ), .data;
, ; .bss.
. ,
,
. . ,
,
:
, , (/);
, ( ), ;
;
. . , , , .
:
( ,
). ,
.
.
, , ,
: _ ;
9
, ,
. ,
.
.
:
, ;
, .
DB, DW, DD DQ. :
, ,
, , _.
NASM ( MASMe
?), RESB, RESW,
RESD RESQ, :
TIMES ( DUP
MASMe):
zerobuf ,
64 .
TIMES , ,
, , :
zerobuf times 64 db 0
TIMES _
_ RESB _
_ DD 1[, 2, ... ]
_ [:] __ ;
10
buffer 64 ,
, . $
. $-buffer,
, hello, world!.
NASM : ,
, .
: ,
, , .
: d, b y, o q, h. -
.
, : 0d
0b , 0o , 0h .
-,
0x.
.
.
,
, . NASM ,
,
, , .
.
, , ,
. ,
,
mov ax,200 ; mov ax,0200d ; mov ax,0c8h ; mov ax,0xc8 ; mov ax,310q ; mov ax,11001000b ; mov ax,1100_1000b ;
buffer: db hello, world! times 64-$+buffer db
11
: 'abcd' 0x61626364, 0x64636261.
:
, . ,
, , abcd, dcba.
db/dw/dd/dq.
.
.
(storage duration):
, , .
. ,
,
.data, .bss. ,
, .
1-1
.
. .
,
io.inc, /.
%include 'io.inc' ; (1) section .text ; (2) ; (3) global CMAIN ; (4) CMAIN: ; (5) MOV EAX, 0 ; (6) RET ; (7)
dd 'ninechars' ; ; dd 'nine','char','s' ; db 'ninechars',0,0,0 ;
12
#include -
, .
, /.
,
io.inc, /.
, , , ,
( .text).
.
, CMAIN
. CMAIN,
io.inc .
,
6. , CMAIN
.
main -.
MOV, EAX
0. RET,
.
-.
6 return 0;
0.
IA-32 32- :
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP (. 3).
AX,
BX, CX, DX, SI, DI, BP, SP. ,
16- . , AX, BX,
CX, DX
#include int main () { return 0; }
13
AL, AH, BL, BH, CL, CH, DL, DH,
8- . L
16- , H
.
3 IA-32.
IA-32
MOV. ,
:
MOV , ;
MOV -1, -2 -2 -1;
MOV , ;
MOV , ;
MOV , . , (
), .
Intel. , ,
MOV (
AX EBX).
14
:
[ ],
(dword, word byte) .
, dword [a] a (32
).
ADD SUB. ,
.
ADD SUB . ,
( ) .
.
. (,
) ,
.
: , ,
.
ADD EBX, EAX ; EBX := EBX + EAX = 1 + 1 = 2, EAX ADD EBX, EBX ; EBX := EBX + EBX = 2 * EBX = 4 SUB EAX, 2 ; EAX := EAX - 2 = 1 - 2 = -1 = 0FFFFFFFFh ADD AX, 1 ; AX := AX + 1 = 0FFFFh + 1 = -1 + 1 = 0 ; EAX 0FFFF0000h
%include 'io.inc' ; (1) section .text ; (2) ; (3) global CMAIN ; (4) CMAIN: ; (5) MOV EAX, 1 ; (6) EAX := 1 MOV EBX, EAX ; (7) EBX := EAX = 1 MOV CL, 040h ; (8) CL := 040h = 0x40 = 64 MOV EAX, 0 ; (9) RET ; (10)
15
1-2
A 0x CAFE BABE.
AX
.
A ,
AX, . IA-32
, :
A+2 0xFE, 0xCA.
, AX
0xCAFE. , 3,
0xCB01.
1-3
4 a, b, c d 1
. 32-
EAX ,
a, b, c, ,
, d. , , a, b, c d
1, 2, 3, 4 . EAX
0x01020304.
,
32- a.
MOV AX, WORD [A + 2] ADD AX, 3
16
.
,
.
section .bss tmp resd 1 section .data a db 1 b db 2 c db 3 d db 4 section .text mov al, byte [a] mov byte [tmp + 3], al mov al, byte [b] mov byte [tmp + 2], al mov al, byte [c] mov byte [tmp + 1], al mov al, byte [d] mov byte [tmp], al mov eax, dword [tmp]
17
/
, ,
() , io.inc.
, . ,
,
/ .
1. /
PRINT_UDEC size, data
PRINT_DEC size, data
data 10- . size , ; 1, 2, 4. data , , , ( ). , size . PRINT_UDEC , PRINT_DEC .
PRINT_HEX size, data , 16- .
PRINT_CHAR ch , ch. , , , ( ). 8 .
PRINT_STRING data , 0. , ( ). , 0 .
NEWLINE .
18
GET_UDEC size, data
GET_DEC size, data
10- . size, (1, 2, 4). . data , , ( ). , GET_DEC GET_UDEC. GET_UDEC , GET_DEC . ESP.
GET_HEX size, data , 16- 0x.
GET_CHAR data , , Enter . , Enter 0xD 0xA. , 1 , .
GET_STRING data, maxsz
, ( ), maxsz . data , ( ). maxsz . 0.
1-4 Hello, World!
Hello, World! .
1-1: .text,
.data,
( 4).
str, .
,
19
, IA-32
str. str
str. ,
, .
,
.
, - 0 .
- ,
.
1-1 10
PRINT_STRING. ,
, Hello, World!\n.
, , ,
.
1-1
.
,
, ,
.
%include 'io.inc' ; (1) ; (2) section .data ; (3) str: db `Hello, World!\n`, 0 ; (4) ; (5) section .text ; (6) ; (7) global CMAIN ; (8) CMAIN: ; (9) PRINT_STRING [str] ; (10) MOV EAX, 0 ; (11) RET ; (12)
hello.asm:4: error: comma, colon or end of line expected
20
()
16-
()
-67
01110110
28h
135
1-2
,
16- .
1-3
DB, , .
1-4
.
.
b resb 1 w resw 1 y resw 1 d resd 1
; a DW 185Ah ; b DW 90 ; c DW 9000 ; d DW 10000, -10000
; e DW 'AB' ; f DW "NASM" ; g DW "Hello" ; h DW "w", "orld", "!"
; i DD 97 ; j DD "x" ; k DD 'CD' ; l DD "Hello, world!"
section .data a dw -2076 b dd -1 c db 128 d dw 256 e dd -15 f db -100
21
1-5
EAX,
. ,
- -
EAX.
section .data a dw 0xDEAD b dw 0xF00D c dw 0xCAFE d dw 0xBABE section .text movsx eax, word [a + 1] ; () movsx ax, byte [b] ; () movzx eax, word [c] ; () movsx eax, byte [b + 2] ; () movzx ax, byte [d + 1] ; () movsx eax, word [b + 1] ; () mov bx, word [a + 1] ; movsx ax, bh ; ()
; a mov b, 1 ; b mov byte [b], 1 ; c mov word [b], 1 ; d mov ax, bx
; e mov ecx, cx ; f mov bh, cl ; g mov dword [d], esi ; h mov byte [w], ch
; i mov word[w], word[y] ; j add 15, bx ; k sub word [y], 8 ; l sub eax, dword [d]
22
1-6
, ,
.
section .data a dw 0x0DEC b dw 0x4A6F c dw 0x7921 d dw 0xFEFF section .text mov ebx, dword [b] ; mov eax, -1 ; movzx ax, bl ; () mov ecx, dword [a + 1] ; mov eax, dword [b + 1] ; movsx ax, cl ; () mov eax, dword [c] ; bswap eax ; ()
23
2.
ADD, SUB, NEG, MUL/IMUL, DIV/IDIV. ,
DEC INC.
,
ADC SBB.
LEA.
EFLAGS: CF , OF , SF , ZF , PF
.
2. .
T
M ( , )
-
3. .
OF SF ZF PF CF
ADC, SBB M M M M TM
ADD, SUB, NEG M M M M M
MUL, IMUL M - - - M
DIV, IDIV - - - - -
DEC, INC M M M M
MOV, XCHG, MOVSX, MOVZX, LEA
.
.
, .
2-1
AL (
), CF, OF, ZF SF
.
24
AL = -60, AL = 196, CF = 1, OF = 1, ZF = 0, SF = 1.
.
70 = 46h, 130 = 82h
46h 82h = C4h, CF (Carry Flag)
1, .
(C4h) 0, , ZF (Zero Flag)
0. SF (Sign Flag)
, .. . 1, , SF
1.
:
C4h = 196 ,
.
-60 (196 = 256 60 = (-60)),
, , -
60.
OF (Overflow Flag)
. ,
( 130) -126
(130 = (-126)). ,
:
70 (-126) = 196
(196)
[-128, 127], , OF
1.
2-2
.
static short int a = 10; static int b = 20, ; c = a + b;
MOV AL, 70 SUB AL, 130
25
a b
.data. c
.bss.
.
,
. a int.
2-3
.
, integer promotions,
.
:
INT_MIN < 0 < USHRT_MAX UCHAR_MAX < INT_MAX
32- IA-32 gcc, ,
.
unsigned char z = 0xff; unsigned short a = 0xff00; unsigned int b; b = a * z;
section .data a dw 10 b dd 20 section .bss c resd 1 section .text movsx eax, word [a] ; add eax, dword [b] ; mov dword [c],eax ;
26
4. .
INT_MIN -2147483648
USHRT_MAX
65535
UCHAR_MAX
char
255
INT_MAX 2147483647
limits.h.
,
,
b. ,
.
2-4
. ,
.
static int a, b = 1, c = -2, d = 3; ... a = b + c * d;
section .bss b resd 1 section .data z db 0xff a dw 0xff00 section .text movzx eax, byte [z] ; ; 8 32 movzx edx, word [a] ; ; 16 32 imul eax, edx ; mov dword [b], eax ;
27
a
.bss. .data.
c d.
IMUL , ,
EAX. EDX:EAX.
, .. EDX,
,
- (
).
EAX .
2-5
.
x y ,
.
static int x, y; ... x /= -y;
section .text mov eax, word [c] imul dword [d] add eax, dword [b] mov dword [a], eax
section .bss a resd 1 section .data b dd 1 c dd -2 d dd 3
28
, ,
x y , ,
.
2-1
b = a; ( ) :
// a static unsigned char a; static unsigned int b; // b static char a; static short b;
section .text mov eax, dword [] ; eax ; x. ; ; , ; edx:eax ; , 32- ; 64 . ; 32 ; . mov edx, eax ; x edx sar edx, 31 ; 31 ; ; , .. ; , edx:eax ; . mov ecx, dword [y] ; ecx ; y neg ecx ; , .. ; (y) idiv ecx ; mov dword [x], eax ; eax ; , x
section .bss x dd 1 y dd 1
29
2-2
AL (
), CF, OF, ZF SF
.
2-3
.
2-4
n ,
n.
2-5 64 32
64- x y. .
// a x += y; // b x -= y;
static unsigned short n; // 100
30
2-6
, .
X RESD 1 ADC WORD [X], WORD [EAX] MUL AL, AH NEG CF SBB DWORD [X], 100 MOV EAX, X DIV 15 SUB EAX, WORD [X] MOVSX EBX, BL XCHG WORD[X], 100 IDIV BYTE [EAX] MOV AL, -150 IMUL EAX, 5
31
3.
;
,
.bss.
.
xp.
.bss.
static int *xp; static int x, y; x = *xp; *xp = y;
section .bss xp resd 1 x resd 1 y resd 1 section .text mov edx, dword [xp] ; EDX xp mov eax, dword [edx] ; EAX ; , xp mov dword [x], eax ; x mov eax, dword [y] ; EAX y mov dword [edx], eax ; EDX ; xp. ; , ; EAX
static int *xp; static int x; xp = &x;
section .bss xp resd 1 x resd 1 section .text mov dword [xp], x
32
3-1
p:
,
**p + 1 ,
PRINT_DEC.
.
3-2
.
.
,
. -
short*. , short ,
static short *px, *py; ... *px++ = --*py;
%include 'io.inc' section .text global CMAIN CMAIN: MOV EAX, DWORD [p] ; EAX ; p MOV EAX, DWORD [EAX] ; ; , EAX ; p, *p MOV EAX, DWORD [EAX] ; EAX **p INC EAX ; PRINT_DEC EAX ; XOR EAX, EAX ; RET ;
static int **p;
33
, IA-32 32- , ..
4 .
Nasm:
.
,
.bss,
.data.
, , . ,
.
.
*px++ = --*py;
*py = *py 1; // (1) *px = *py; // (2) px = px + 1; // (3)
*(px++) = --(*py);
--(*py); *px = *py; px++;
section .bss px dd 1 py dd 1
34
3-3
,
.
.
xp, yp zp 8, 12 16
, ebp. decode1
, .
.
mov edi, dword [ebp + 8] ; (1) mov edx, dword [ebp + 12] ; (2) mov ecx, dword [ebp + 16] ; (3) mov ebx, dword [edx] ; (4) mov esi, dword [ecx] ; (5) mov eax, dword [edi] ; (6) mov dword [edx], eax ; (7) mov dword [ecx], ebx ; (8) mov dword [edi], esi ; (9)
void decode1(int *xp, int *yp, int *zp)
section .text mov eax, dword [py] ; (1) eax ; py dec word [eax] ; 16- ; , ; eax, .. py mov cx, word [eax] ; (2) cx ; mov eax, dword [px] ; eax ; px mov word [eax], cx ; , ; , ; px, *py add dword [px], 2 ; (3) px. ; ; ; 1 * sizeof(short), . 2
35
, .. - ,
ebx, esi, eax.
edi, edx, ecx, ,
,
, ebx, esi, eax.
, -.
y ebx, z esi, x eax.
3-4
-
.
void decode1(int *xp, int *yp, int *zp) { int y = *yp; int z = *zp; int x = *xp; *yp = x; *zp = y; *xp = z; }
mov dword [edx], eax ; (7) *yp eax *xp mov dword [ecx], ebx ; (8) *zp ebx *yp mov dword [edi], esi ; (9) *xp esi *zp
mov ebx, dword [edx] ; (4) ebx *yp mov esi, dword [ecx] ; (5) esi *zp mov eax, dword [edi] ; (6) eax *xp
mov edi, dword [ebp + 8] ; (1) edi xp mov edx, dword [ebp + 12] ; (2) edx yp mov ecx, dword [ebp + 16] ; (3) ecx zp
36
, .
p . 40
, , 4
.
8- p+32,
, .. ,
. ,
1, .
3-1 -
,
.
.
void decode2(int *xp, int *yp, int *zp)
mov eax, dword [p + 32] mov eax, dword [eax] add eax, 1 mov dword [x], eax
static int *p[10]; static int x; x = *p[8] + 1;
37
xp, yp zp 8, 12 16
, ebp. decode2
, .
3-2
,
.
3-3
100 . ,
eax
, :
a) char,
b) short,
c) int.
3-4
-
.
// a int x, *px; *px++ = x -10; // b short x, *px; x = *(--px + 4);
mov eax, dword [ebp + 12] mov edi, dword [eax] mov eax, dword [ebp + 8] mov edx, dword [eax] mov eax, dword [ebp + 16] mov eax, dword [eax] add edx, eax mov eax, dword [ebp + 12] mov dword [eax], edx mov eax, dword [ebp + 8] mov dword [eax], edx mov eax, dword [ebp + 16] mov dword [eax], edi
38
3-5 -
-
.
// a short **p; ++*(*(p+=3) -= 2); // b char **q, **r, **t; r = q++; *t = (*r)++; **q = (**t)++;
static int a[50]; static int *p, *q; static int n; p = &a[10]; q = &a[25]; n = q - p;
39
4. IA-32
jmp Jcc, ,
EFLAGS.
4. .
Jcc
JE ZF /
JNE ~ZF /
JS SF
JNS ~SF
JG ~(SF^OF)&~ZF ( )
JGE ~(SF^OF) ( )
JL (SF^OF) ( )
JLE (SF^OF)|ZF ( )
JA ~CF&~ZF ( )
JB CF ( )
: (1)
EFLAGS (2) . , ,
CMP, EFLAGS ,
SUB, , ..
.
IA-32 do-while
. ,
ECX (CX), .
, LOOP/LOOPcc
[128, 127] .
LOOP/LOOPcc ECX ,
, . ,
ECX,
232 .
40
5. .
JCXZ/JECXZ , CX/ECX .
LOOP , ECX .
LOOPZ/LOOPE , ECX ZF .
LOOPNZ/LOOPNE , ECX ZF .
4-1
, data_t
, COMP . a
EDX, b ECX.
, ,
data_t COMP ( ).
SETcc L, ,
EAX EDX 32 .
int long,
signed.
>, L
1 < 2 .
, .
1 < 2 ECX < EDX b < a a > b
int comp(data_t a, data_t b) { return a COMP b; }
CMP ECX, EDX SETL AL
41
4-2
.
a b.
32-. ,
, .
.
:
3 6 12.
( TEST JE) .
1-6 :
static int a, b;
SECTION .text GLOBAL CMAIN CMAIN: MOV ESI, DWORD [a] ; (1) TEST ESI, ESI ; (2) JE .1 ; (3) MOV ECX, DWORD [b] ; (4) TEST ECX, ECX ; (5) JE .1 ; (6) MOV EDX, DWORD [ESI] ; (7) MOV EAX, EDX ; (8) SAR EDX, 31 ; (9) IDIV ECX ; (10) SUB DWORD [ESI], EDX ; (11) .1: XOR EAX, EAX ; (12) RET ; (13)
int comp(int a, int b) { return a > b; }
42
,
&& , 4-6
,
3.
7-11.
ESI, a
, .. a ,
.
, , eax edx,
edx
, , , 10 .
,
signed,
int, .
idiv *a b,
ecx
b.
. ,
,
. edx ( 11),
.
, ,
a.
.
,
if, .
*a = *a *a % b;
static int *a, b;
if ((0 != a) && (0 != b)) { ... }
if (0 != a) { if (0 != b) { ... } }
43
4-1
data_t , COMP -
. a EX.
, ,
data_t COMP ( ).
4-2
, data_t
, COMP . a
EDX, b ECX.
, ,
data_t COMP ( ).
int comp(data_t a, data_t b) { return a COMP b; }
(A) TEST EX, EX SETNE AL () TEST X, X SETE AL
() TEST L, L SETG AL () TEST X, X SETA AL
int comp(data_t a) { return a COMP 0; }
static int *a, b; if ((0 != a) && (0 != b)) { *a -= *a % b; }
44
4-3
-.
x = (y 0) { *p += a; } }
int x, y = 100, a = 0, b = 1; x = y
45
4-7
,
. : ,
, , .
4-8 :
, -.
- .
.
int test(int x, int y) { int val = __________; if (______) { if (______) { val = __________; } else { val = __________; } } else if (______) { val = __________; } return val; }
mov eax, dword [ebp + 8] ; x mov edx, dword [ebp + 12] ; y cmp eax, -3 jge l2 cmp eax, edx gle l3 imull eax, edx jmp l4 l3: lea eax, dword [eax + edx] jmp l4 l2: cmp eax, 2 jg l5 xor eax, edx jmp l4 l5: sub eax, edx l4:
46
4-9 :
, .
-.
4-10
, .
4-11 :
:
int dw_loop(int x, int y, int n) { //1 { //2 do { //3 x += n; //4 y *= n; //5 n--; //6 } while ((n > 0) && (y < n)); //7 return x; //8 }
mov ebx, dword [a] mov ecx, dword [b] cmp ebx, ecx jg .L7 jl .L8 xor eax, eax jmp .L9 .L8: mov edx, dword [c] mov eax, edx sar edx, 31 sub ecx, ebx idiv ecx jmp .L9 .L7: mov edx, dword [c] mov eax, edx sar edx, 31 sub ebx, ecx idiv ebx .L9: mov dword [d], eax
... static _____________________ a; static _____________________ b; static _____________________ c; static _____________________ d; if (__________) { d = ________________; } else if (__________) { d = ________________; } else { d = ________________; } ...
47
, -,
, , -.
4-12
,
:
4-13
(unsigned int).
4-14
,
N (N > 1). : F0
= F1 = 1, Fk = Fk-1 + Fk-2, k 2.
4-15
30 . :
a) ,
b) (,
),
c) .
mov al, -80 cmp al, 150 jb M1 jl M2 jmp M3
mov eax, dword [ebp + 8] ; (1) x mov ecx, dword [ebp + 12] ; (2) y mov edx, dword [ebp + 16] ; (3) n L2: ; (4) add eax, edx ; (5) imul ecx, edx ; (6) sub edx, 1 ; (7) test edx, edx ; (8) jle L5 ; (9) cmp ecx, edx ; (10) jl L2 ; (11) L5: ; (12)
48
5.
5-1
a, b, c, d.
0 1.
a.
a, b, c d , .bss.
,
.
, (~c & d) | (c & ~d)
, ..
, .
section .bss a resd 1 b resd 1 c resd 1 d resd 1 section .text mov eax, dword [c] ; eax c mov edx, dword [d] ; edx d mov ecx, eax ; c ecx not eax ; eax ~c and eax, edx ; eax ~c & d not edx ; edx ~d and ecx, edx ; ecx c & ~d or eax, ecx ; eax (~c & d) | (c & ~d) mov edx, dword [a] ; edx a and edx, dword [b] ; edx a & b not edx ; edx ~(a & b) or eax, edx ; eax ~(a & b) | ((~c & d) | (c & ~d)) mov dword [a], eax ; a ~(a & b) | ((~c & d) | (c & ~d))
static int a, b, c, d; a = ~(a & b) | ((~c & d) | (c & ~d));
49
5-2
a b 2 . EAX
: 2
a, 2 b,
5 .
5-3
, ,
.
, .
: x [ebp + 8], y
[ebp + 12], z [ebp + 16].
mov eax, dword [ebp + 12] ; (1) xor eax, dword [ebp + 8] ; (2) shr eax, 3 ; (3) not eax ; (4) sub eax, dword [ebp + 16] ; (5)
int arith(int x, int y, int z) { int t1 = _________; int t2 = _________; int t3 = _________; int t4 = _________; return t4; }
section .bss a resw 1 b resw 1 section .text mov ax, word [a] ; a ; 16 ; EAX shl eax, 16 ; mov ax, word [b] ; b ; EAX ror ax, 5 ;
50
.
y eax. ,
-.
xor y x.
eax. ( 3)
3 . , ,
.
, , 5,
z.
, ,
eax.
,
.
t4,
5 EAX,
.
5-4
32- a.
3 1, 17 0, 23
.
bts, btr, btc.
int arith(int x, int y, int z) { int t1 = y ^ x; int t2 = t1 >> 3; int t3 = ~t2; int t4 = t3 - z; return t4; }
51
5-5
, eax 6,
. eax.
5-1
x .
, eax 1, x < 0, 0
.
5-2
eax 5 5 .
5-3
.
// a static int x;
// b static short x;
// c static char x;
mov ebx, eax ; ebx shl ebx, 2 ; ebx 2 ; ( 4) shl eax,1 ; eax 1 ; ( 2) add eax, ebx ; , ; eax
section .bss a resd 1 section .text bts dword [a], 3 btr dword [a], 17 btc dword [a], 23
52
5-4
eax ( ) edx (
) .
5-5
.
5-6
eax 1,
5 , 0 .
5-7
,
L , a .
5-8
"" .
5-9 sign
sign, MOV, SHR, NEG OR.
section .data x dd 0xfeff0201 section .text mov cx, word [x + 1] mov ax, cx imul ah shl ax, cl movsx eax, ax movzx edx, ax
// a static unsigned x, y; y = 32 * x x / 8 + x % 16; // b static long long x; x *= 2; // c static int x, y; y = x / 64 + x * 4;
53
5-10
, ,
1 0 .
: 10100111 00001000
5-11
ROL, ROR, RCL, RCR SAR,
, .
) sar eax, 2 b) rol bx, 1 c) rcr ecx, 1 d) rol ax, 8 e) rcl ebx, 31
54
6.
1-1
()
16-
()
10111101 BDh -67 189
01110110 76h 118 118
00101000 28h 40 40
10000111 87h -121 135
1-5
() EAX = 0xdde
() EAX = 0xd
() EAX = 0xcafe
() EAX = 0xfffffffe
() EAX = 0xffff00ba
() EAX = 0xfffffef0
() EAX = 0xffff000d
() EAX = 0xffff006f
() EAX = 0xff79000d
() EAX = 0x2179fffe
1-6
2-1
; a movzx eax, byte [a] mov dword [b], eax ; b movsx eax, byte [a] mov word [b], eax
section .bss a resd 1 b resd 1 section .text mov al, byte [a] mov byte [b], al mov al, byte [a + 1] mov byte [b + 3], al mov ax, word [a + 2] mov word [b + 1], ax
55
2-2
(a) AL = -118, AL = 138, CF = 1, OF = 0, ZF = 0, SF = 1.
(b) AL = 5, AL = 5, CF = 0, OF = 0, ZF = 0, SF = 0.
(c) AL = -90, AL = 166, CF = 1, OF = 0, ZF = 0, SF = 1.
(d) AL = 58, AL = 58, CF = 1, OF = 0, ZF = 0, SF = 0.
3-1
4-1
() data_t int, unsigned, , long COMP - != () data_t short unsigned short COMP - == () data_t char COMP - > () data_t unsigned short COMP - >
void decode2(int *xp, int *yp, int *zp) { int y = *yp; *yp = *xp + *zp; *xp = *yp; *zp = y; }
56
4-2
4-3
section .bss x resd 1 section .data y dd -1 a dd 0 b dd 1 section .text global CMAIN CMAIN: cmp dword [y], 0 mov eax, dword [b] cmovle eax, dword [a] mov dword [x], eax
() data_t short COMP - >= () data_t unsigned char COMP - < () data_t int, unsigned, ; long COMP - !=
57
4-4
4-5
4-6
%include 'io.inc' section .text global CMAIN CMAIN: GET_DEC 4, ecx mov eax, 1 jecxz end_label loop_body: imul eax, ecx loop loop_body end_label: PRINT_DEC 4, eax mov eax, 0 ret
test eax, eax jz label test edx, edx jle label add dword [eax], edx label:
%include 'io.inc' section .text global CMAIN CMAIN: GET_DEC 4, eax cmp eax, 0 jge label neg eax label: PRINT_DEC 4, eax NEWLINE xor eax, eax ret
58
4-7
4-8
.
. .
.
CMP Jcc,
if . ,
.
int test(int x, int y) { int val = x^y; if (x < -3) { if (y < x) { val = x * y; } else { val = x + y; } } else if (x > 2) { val = x - y; } return val; }
%include 'io.inc' section .text global CMAIN CMAIN: GET_DEC 4, ebx ; GET_DEC 4, edx ; GET_DEC 4, ecx ; xor eax jexcz end_label loop_body: add eax, ebx add ebx, edx loop loop_body end_label: PRINT_DEC 4, eax mov eax, 0 ret
59
4-9
... static int a; static int b; static int c; static int d; if (a > b) { d = c / (a - b); } else if (a < b) { d = c / (b - a); } else { d = 0; } ...
int test(int x, int y) { int val; if (x < -3) { if (y < x) { val = x * y; } else { val = x + y; } } else if (x > 2) { val = x - y; } else { val = x^y; } return val; }
60
4-10
4-11
4-12
M3
mov eax, dword [ebp + 8] ; (1) x mov ecx, dword [ebp + 12] ; (2) y mov edx, dword [ebp + 16] ; (3) n L2: ; (4) add eax, edx ; (5) x += n; imul ecx, edx ; (6) y *= n; sub edx, 1 ; (7) n--; test edx, edx ; (8) n v 0 jle L5 ; (9) n
61
:
M1 , 176 > 150;
M2 , .. -80 > -106.
M3.
5-4 eax = -8 edx = 65528
mov al, -80; (-80) = 176 cmp al, 150; 150 = (-106) jb M1 jl M2 jmp M3
62
1. . , . :
(Computer Systems: A Programmers Perspective).
: -, 2005 . 1186 .
2. Henry S. Warren. Hacker's Delight (2nd Edition). / Addison-Wesley Professional; 2
edition (October 5, 2012) . 512
3. .. , .. , .. , .. ,
.. .
(- 1 ). .:
..
4. .. , .. , .. , .. , .. .
( - ). .: . - ..
, 2012.
5. .. , .. , .. , .. , .. ,
.. .
( ). .: . - .. ,
2012.