Muke sa asemblerom

Muke sa asemblerom

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

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 Mr. Green Samo sam trebao da uskladištim obe rečenice u sekciju sa podacima i da ih posle skladištim u registre Razz

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 Smile



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14822
  • Gde živiš: Niš

Sve je to oko, samo gde nađe "skladišne" i "generalne" registre? Very Happy

Ja evo već 3 meseca proučavam asembler i arhitekturu mikroprocesora i ni jednom nisam čuo te termine. Kod mene ih zovemo registri opšte namene, i čini se kao da je to najprecizniji i najbliži naziv. Very Happy



offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Gledaj Vaso, ja sam naučio da postoje generalni (ili kako ti kažeš opšte namene), kontrolni i segmentni registri. Generalni se dalje dele na skladišne, pokazivačke i indeksne registre. Tako sam ja naučio Smile

U kom asembleru radiš ako nije tajna? Ziveli

Ko je trenutno na forumu
 

Ukupno su 749 korisnika na forumu :: 10 registrovanih, 0 sakrivenih i 739 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: hyla, ILGromovnik, Koridor, LUDI, mikki jons, milenko crazy north, Motocar, stalja, zicko.spacek, Živković