⚔️Ex 2 (linux)

Thuật toán fibonaci trong ngôn ngữ C:
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
}
================================================================================
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;
}
_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
Lưu ý: là tôi chỉ hiển thị được trong vùng 6 kí tự đầu tiên của chuỗi fibonaci. Nếu bạn muốn xử lí những số có nhiều hơn 2 chữ số thì thêm 1 hàm xử lí chuyển từ chuỗi byte --> số
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