03 Machine Language
Machine Language
Compile
# -Og: do not optimize, generate assembly code according to the program
# -S: generate assembly
gcc -Og -S test.c # test.s, assembly code
gcc -Og -c test.c # test.o, binary machine code
Registers
-
Caller-saved / Callee-saved Register: different strategies to save register context at calling functions.

-
Size of data type (remember the suffix!)

- b: 1 byte
- w: word, 2 bytes (old machine convention, 1 word only equals 2 bytes. Now we usually have 8 bytes = 64 bits for a word.)
- l: long word, 4 bytes
- q: quad word, 8 bytes
-
All 16 registers:
Name convention for the 8 old registers at different bit length:
64 bits rax rbx rcx rdx rsi rdi rbp rsp 32 bits eax ebx ecx edx esi edi ebp esp 16 bits ax bx cx dx si di bp sp 8 bits al bl cl dl sil dil bpl spl 
And there are 8 new registers:

Instructions
- Operation Code:
movq, addq, subq, xorq, ret
-
Operands:
- Immediate:
$1, $8
- Register:
%rax, %rdi, %rsi
-
Memory Reference:
(%rbx)

- Immediate:
-
mov S, D- Source and Destination cannot be both memory address.
- 32-bit operation will also set the higher 32 bits to 0, but other operation won't.
movb $-1 %al: lower 8 bits changed to 0xFF.movl $-1 %eax: lower 32 bits changed to 0xFFFFFFFF, but higher 32 bits of%raxalso changed to 0x000000 !
movz: zero-extendingmovs: signed-extendingcltq: equalsmovslq %eax, %rax.
-
example:

-
Stack related
%rsprecords the stack pointer (stack grows from high address to low address).pushq %rax: equalssubq $8, %rsp; movq %rax, (%rsp)popq %rbx: equalsmovq (%rsp), %rbx; addq $8, %rsp
-
leaq S, D: load effective address.Directly write the value of S into D (as an address).
movq (%rdx, %rdx, 2), %rax # write the value at memory location (3 * %rdx) to %rax leaq (%rdx, %rdx, 2), %rax # directly write (3 * %rdx) to %raxCan be used to load address, or abused to perform simple multiplying & adding...
-
Unary
inc Ddec Dneg Dnot D
-
Binary
add S, Dsub S, Dimul S, Dxor S, Dor S, Dand S, D
-
Shift
kcan only be an immediate number, or the value in%cl.sal/shl k, D: left shiftsar k, D: right shift, arithmeticshr k, D: right shift, logical
Example: use
leaqandsalto perform multiplication.
-
Condition Code Register
Controlled by ALU, the values are determined by the most recent operation's result.
- CF: Carry Flag, Set to 1 if overflow happened for unsigned operation.
- ZF: Zero Flag, Set to 1 if result is 0.
- SF: Sign Flag, Set to 1 if result is negative.
- OF: Overflow Flag, Set to 1 if overflow happened for signed operation.
Two instructions for CCR:
cmpq S, D, equal tosubq, but only set CCR.testq S, D, equal toaddq, but only set CCR.sete D, set-equal, set D to 1 if lastcmpqsetZFto 1 (i.e.,S == D for cmpq S, D)setl D, set-less, set D to 1 if lastcmpqsetSF ^ OFto 1 (i.e.,S < D for cmpq S, D,OFconsiders signed overflow condition)setle D, set-less-equal,(SF ^ OF) | ZFsetg D, set-greater,~(SF ^ OF) & ~ZFsetge D, set-greater-equal,~(SF ^ OF)seta D, set-above,~CF & ~ZF, for unsigned greater.setae D, set-above-equal,~CF, for unsigned greater-equal.setb D, set-below,CF, for unsigned less.setbe D, set-below-equal,CF | ZF, for unsigned less-equal.
TODO: 3-6