Napisano: 14 Nov 2013 18:48
Pokušavam da ispišem dve rečenice u NASM mada mi ne uspeva nešto...
section .text
global _start ;mora biti deklarisano za linker (ld)
_start: ;linker startni deo
mov edx,len ;duzina poruke
mov ecx,msg ;poruka za ispis
mov ecx,msgr ;poruka 2 za ispis
mov ebx,1 ;fajl deskriptor (stdout)
mov eax,4 ;sistemski broj za poziv (sys_write)
int 0x80 ;poziv kernelu
mov eax,1 ;sistemski broj za poziv (sys_exit)
int 0x80 ;poziv kernelu
section .data
msg db 'Zdravo, svete!', 0xa ;string
msgr db '...', 0xa ;string2
len equ $ - msg ;duzina stringa
len equ $ - msgr ;duzina stringa
Greška ::
Compiling main.asm source code....
$nasm -f elf main.asm 2>&1
main.asm:18: error: symbol `len' redefined
Compiling the source code....
$ld -m elf_i386 -s -o demo *.o 2>&1
ld: *.o: No such file: No such file or directory
E, ovu grešku za redefinisano 'len' sam rešio tako što sam dodao u registar edx , lenc za drugi string (...), i nakon toga mi je ispisao samo string
...
Sad prepostavljam da je to zbog toga što i prvi i drugi string imaju adresu 0xa , pa kompajler daje prioritet drugom stringu, ali kako da imenujem adresu za drugi string?
Dopuna: 27 Jan 2014 17:28
Rešen problem Samo sam trebao da uskladištim obe rečenice u sekciju sa podacima i da ih posle skladištim u registre
segment .data
prvaPoruka db 'Prva recenica. ' ; prva recenica
duzinaPrvePoruke equ $-prvaPoruka ; duzina prve poruke
drugaPoruka db 'Druga recenica. ' ; druga recenica
duzinaDrugePoruke equ $-drugaPoruka ; duzina druge recenice
segment .text
global _start
_start:
; EAX, EBX, ECX i EDX su 32-bitni skladisni registri. Skladisni registri pripadaju generalnim registrima.
mov eax, 4
mov ebx, 1
mov ecx, prvaPoruka
mov edx, duzinaPrvePoruke
int 80h ; sistemski poziv (sys_write) na Linuksu
; svi sistemski pozivi sa njihovim brojevima (koji idu u registar EAX pre pozivanja int 80h) na Linuksu se nalaze u direktorijumu : /usr/include/asm/unistd.h
mov eax, 4
mov ebx, 1
mov ecx, drugaPoruka
mov edx, duzinaDrugePoruke
int 80h ; sistemski poziv (sys_write) na Linuksu
; Izlazni kod
mov eax, 1
mov ebx, 0
int 80h
Dodato malo objašnjenje u komentarima za one koje zanima šta koji deo radi
|