Computer Organization
January 28, 2023
How to Assembly by Tonkaew
Creating Label
int func1() { }
func1:
movq
- movq src, dest
example.
mov $6, %rdi ; regis rdi = 6 mov $0x4000, %rdi ; regis rdi = 0x4000 mov $6, (%rdi) ; meme mem[0x4000] = 6
-
Type of movq
- 5(%rdi) = mem[%rdi + 5]
- (%rdi, %rsi) = mem[%rdi + %rsi]
- (%rax, %rdi, %rsi) = mem[%rax + (%rdi * %rsi)]
- (%rax, %rdi, 4) = mem[%rax + (4 * %rdi)]
- 5(,%rdi,%rsi) = mem[5 + (%rdi * %rsi)]
-
movl (long)
-
movq (words)
Arithmatics instruction
- adds src, dest ; dest = dest + src
example.
; %rdi = 5 ; %rsi = 4 addq %rdi, %rsi ; %rsi = 4 + 5 = 9
- subq src, dest
- imulq src, dest
- salq: Shift Arithmatic Left
- shlq: Shift Logic Left
- sarq: Shift Arithmatic Right
- shrq: Shift Logic Left
- xorq src, dest
- andq src, dest
- orq src, dest
- incq dest ; increase, dest = dest + 1
- decq dest ; decrese, dest = dest - 1
- negq dest ; negative, dest = -1 * dest
- notq dest ; not, dest = ~dest
Convert C <=> Assembly
int fun1(int a) { return a; }
fun1: movs %rdi, %rax
int fun2(int a, int b) { return a + b; }
fun2: movs %rdi, %rax ; return = a adds %rsi, %rax ; return = a + b
- jmp
.l1: ... jmp .L2 .. .. .l2: ... .final: ...
Condition flags
- ZF Zero
- OF Overflow
- SF Signed
- CF Carry
testq
- testq src2, src1
- src2 & src1 == 0 ZF = 1
- src2 & src1 < 0 SF 1
example.
; %rdi = 0 testq %rdi, %rdi ; ZF 1 ; SF 0 ; %rdi = 1 testq %rdi, %rdi ; ZF 0 ; SF 0
adds 0b1111 + 0b0001 0b0000 CF = 1 ZF = 0
cmpq
- cmpq a, b example.
cmpq a, b je ; jump if a == b jne ; jump if a != b js ; jump if (b - a) is negative jns ; jump if (b - a) is not negative jg ; jump if b > a jge ; jump if b >= a jl ; jump if b < a jle ; jump if b <= a
int func3(int a, int b) { if(a > b) { // b < a return a; // L1 } else { return b; // L2 } }
func3: cmpq %rdi, %rsi ; compare a, b jl L1 L2: movs %rsi, %rax jmp finally L1: movs %rdi, %rax finally: ...
movq (%rdi), %rax ; %rax = mem[%rdi] leaq %rax, (%rdi) ; mem[%rdi] = %rax ; rdi = 0x4000 0000 movq 4(%rdi), %rax ; %rax = mem[0x4000 0004] laeq 4(%rdi), %rax ; %rax = 0x4000 0004
// sums n * (n + 1) / 2 int func1(int a) { int b = 0; while(a != 0) { a -= 1; b += a; } return b; }
func1: movq $0, %rbx ; %rbx = 0 = b movq %rbx, %rax ; %rax = b = 0 ; not exists in C loop: testq %rdi, %rdi ; test a je endLoop ; if a == 0, jump to endLoop subq $1, %rdi ; %rdi -= 1; a -= 1; addq %rdi, %rax ; %rax += %rdi; b += a; jmp loop endLoop: ret
Stacks %rsp: stack pointer ,%rbp: base pointer
- pushq ; push into stacks
- popq ; pop out off stacks
- call; call function, push current pc + 1 intp stacks
- ret ; pop, and set pc to that data
Branch / Jump
- jmp: jump without condition
- je: jump equal or zero
- jne: jump not equal or not zero
- js: jump negative (signed)
- jns: jump not negative (signed)
- jg: jump greater
- jge: jump greater or equal
- jl: jump less
- jle: jump less or equal
- ja: jump above (~CF & ~ZF)
- jb: jump below (CF)
อื่นๆ
- ส่วนของ Computer
- CPU
- ALU
- Bus
- Cache
- Register
- Memory
- CPU
function in C, arguments (int a, int b, ...); -> %rdi %rsi %rdx %rcx %r8 %r9
in c return x; in asm %rax
Back to cscourse