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: 14824
  • 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 1179 korisnika na forumu :: 32 registrovanih, 6 sakrivenih i 1141 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: Aleksandar Tomić, armor, bojcistv, bokisha253, dankisha, Dannyboy, doktor1964, Dorcolac, dule10savic, Georgius, Jester, joca83, Krusarac, lcc, Metanoja, milenko crazy north, milos.cbr, Milos1389, naki011, Nemanja.M, nemkea71, Prometeus, raketaš, raptorsi, Srle993, Tandrkalo, voja64, Volkhov-M, wizzardone, wolf431, yufighter, |_MeD_|