⚔️Ex 2 (linux)

Thuật toán fibonaci trong ngôn ngữ C:

Fibonaci algorithm
int main()
{
    int n = 6;
    int i = 0;
    int num = 0, num1 = 1, last_num = 0;
    n++;
    while(n > 1){
        last_num = num1;
        num1 += num; 
        num = last_num;
        printf("%d ", last_num);
        n--;
    }
    return 0;   //exit
}

================================================================================

Convert a string to a number algorithm
int main() {
    char buf[5] = "1234";
    int sum = 0;
    int i = 0;
    while (i < 4) {
        sum = sum * 10;
        sum += buf[i] - '0';
        i++;
    }
    return 0;
} 
convert.c --> convert.asm
_process_num:
    mov rcx, rax  ;move number of entered to rsi
    mov rbx, rax
    mov rdx, 0  ;where to save sum of number entered
    mov rdi, 0  ;i = 0
    dec rcx
    l1:
        push rcx
        cmp rdi, rbx ; compare (i & 4)
        jge exit_loop
        jl proc
        proc:
            mov rsi, rdx
            shl rdx, 3    ; equal num *= 10
            shl rsi, 1    ; num = (num<<3)+(num<<1)
            add rdx, rsi
            sub byte [request+rdi], 0x30    ;buf[i] - "0"
            add dl, byte [request+rdi]
            inc rcx
            inc rdi
        jmp exit_loop
        exit_loop:
        pop rcx
    loop l1
    mov qword [request], rdx  ;return value
    ret

FULL CODE

SYS_write    equ     0x4
SYS_read     equ     0x3
SYS_exit     equ     0x1
stdout       equ     0x1
stdin        equ     0x0
section .data
    msg1    db  "Enter n that you is number of display: "
    len1    equ $-msg1
    msg2    db  "Your fibonaci sequence: ", 0xa
    len2    equ $-msg2
    msg3    db  " "
    len3    equ $-msg3
    msg4    db  "",0xa
    len4    equ $-msg4
section .bss
    request     resd    0x3
    last_num    resd    0x8   
section .text
    global _start

; use convert string to number algorithms
_process_num:
    mov rcx, rax  ;move number of entered to rsi
    mov rbx, rax
    mov rdx, 0  ;where to save sum of number entered
    mov rdi, 0  ;i = 0
    dec rcx
    l1:
        push rcx
        cmp rdi, rbx ; compare (i & 4)
        jge exit_loop
        jl proc
        proc:
            mov rsi, rdx
            shl rdx, 3
            shl rsi, 1
            add rdx, rsi
            sub byte [request+rdi], 0x30
            add dl, byte [request+rdi]
            inc rcx
            inc rdi
        jmp exit_loop
        exit_loop:
        pop rcx
    loop l1
    mov qword [request], rdx
    ret

_printf:
    add byte[last_num], 0x30 ;convert to number
    mov eax, 0x4
    mov ebx, 0x1
    mov ecx, last_num
    mov edx, 0x8
    int 0x80

    mov eax, 0x4
    mov ebx, 0x1
    mov ecx, msg3
    mov edx, len3
    int 0x80
    ret

_start:
    ;printf("Enter n: ");
    mov rax, SYS_write
    mov rbx, stdout
    mov rcx, msg1
    mov rdx, len1
    int 0x80
    ;scanf("%d", &request)
    mov rax, SYS_read
    mov rbx, stdin
    mov rcx, request
    mov rdx, 0x3
    int 0x80
    ;############# CONVERT #############
    ;merge to a number(purpose is use for rcx): 
    ; Example: when you entered:12 --> \x31\x32
    call _process_num; (rsi, request)

    ;############# FIBONACI ############
    ; |rdx = n| rax = size |
    xor rbx, rbx
    xor rdi, rdi  ;num = 0
    xor rsi, rsi   ;num1 = 1
    inc rsi
    mov rcx, rdx  ;rcx = n
    xor rdx, rdx    ;last_num
    inc rcx
    l2:
        push rcx
        mov rdx, rsi    ;last_num = num1;
        add rsi, rdi    ;num1 += num; 
        mov rdi, rdx    ;num = last_num;
        mov qword [last_num], rdx
        push rdx
        push rsi
        push rdi
        push rax
        call _printf
        xor rbx, rbx
        xor rdi, rdi
        xor rsi, rsi
        xor rdx, rdx
        pop rax
        pop rdi
        pop rsi
        pop rdx
        pop rcx
    loop l2    

exit_start:
    mov eax, 0x4
    mov ebx, 0x1
    mov ecx, msg4
    mov edx, len4
    int 0x80
    mov rax, SYS_exit
    int 0x80

Last updated