#1 Petr35
měl jsem dnes chuť to zkusit vytvořit
použit online kompiler
https://www.tutorialspoint.com/compile_assembly_online.php
případné nastavení kompilace v Project-Compile options:
nasm -f elf64 *.asm; ld -m elf_x86_64 -s -o demo *.o
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov rdi, poleA ;pointer poleA
mov rsi, poleB ;pointer poleB
mov rcx, lenA ;prvků v poli A
call _hamming ;vrátí počet rozdílů v RAX
mov rdi, msgK ;adresa pro převod HEX na DEC od konce
dec rdi ;-1 znak odřádkování
mov rcx, lenmsg ;znaků pro číslo (aktuálně 32 lze zvýšit)
call _HEXtoDec ;převod HEX na DEC, RAX číslo, RDI cíl, RCX max číslic
;vrátí v RDI začátek čísla
mov rdx, msgK ;vezme adresu konce
sub rdx, rdi ;odečte adresu začátku => RDX délka zprávy
mov rcx, rdi ;začátek zprávy
mov rbx, 1 ;file descriptor (stdout)
mov rax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov rbx, 0
mov rax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
_hamming: ; vstup ESI a EDI pointery na pole, ECX velikost poleA
xor rax,rax ;počítadlo
hammL:
mov rbx, qword [rdi]
cmp rbx, qword [rsi]
je hammL2
inc rax
hammL2:
add edi, 8
add esi, 8
loop hammL ;opakuj pro prvky pole
ret ;RAX počet rozdílů
;převod čísla HEX na DEC-string
_HEXtoDec: ;RAX = value, RDI = dest od konce, RCX = dest size
and rax, rax
jz tDend
mov rdx, 0
mov rbx, 10
div rbx
add rdx, 0x30
mov [rdi], dl
dec rdi
loop _toDec
tDend:
ret ; v RDI začátek
section .data
poleA dq 1, 0, 0, 1, 0
lenA equ ($ - poleA) / 8
poleB dq 1, 1, 0, 1, 1
lenB equ ($ - poleB) / 8
msgZ times 32 db 0x20
msgK db 0x0A
lenmsg equ msgK - msgZ
mov