Keresés


Toplista

Toplista
  • betöltés...

Magántanár kereső

Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!

Az alábbi Assembly program ,miért nem jó ?

341
.intel_syntax noprefix

.data
hello_word: .asciz "Hello World!\n"

.text
.global main
main:
push ebp
mov ebp, esp

push offset hello_world
call printf
pop eax
mov eax, 0

mov esp, ebp
pop ebp
ret

(szinte egy nagyon kis apró hiba van benne ,amit nem találok..)

Illetve megköszönném ,ha azt is ki tudnátok fejteni ,hogy az egyes sorok mit csinálnak konkrétan és mire valóak.
Jelenleg 1 felhasználó nézi ezt a kérdést.
0
Felsőoktatás / Informatika

Válaszok

3
.data
msg db 'Hello, World!',0Dh,0Ah,'$'
.text
.global main
main:
push ebp
mov ebp, esp

push offset hello_world
call printf
pop eax
mov eax, 0

mov esp, ebp
pop ebp
ret

Szerintem így már jó lesz
0

A string definiálásakor hello_word a neve, amikor pedig használod a push-nál, akkor hello_world. A definiáláskor is kell az ℓ betű.

Ezen kívül amikor gcc-vel fordítasz, akkor -m32 opcióval csináld, mert ez 32 bites kód.
És valószínű kell még egy .code32 sor is a .intel_syntax után
Módosítva: 5 éve
0

.intel_syntax noprefix
# ezzel azt mondod, hogy nem AT&T szintaxissal írod az ASM kódot, hanem Intel-lel

.code32
# Ez akkor kell, ha a Linux-od 64 bites. Ezzel mondod meg, hogy 32 bites kódot kell fordítani

.data
# Minden, ami ez után jön, a "data" szegmensbe kerül

hello_world: .asciz "Hello World!\n"
# definiálsz egy "hello_world" nevű változót (memóriahelyet), aminek a tartalma az .asciz utáni string. A string végén lesz egy lezáró 0 byte is.

.text
# Minden, ami ez után jön, a "text" vagyis programkód szegmensbe kerül

.global main
# a "main" nevű cimkét (memóriahelyet) tegye globálissá, hogy kívülről meg lehessen hívni

main:
# ez itt a "main" cimke. Ez után van a main() szubrutin tartalma

push ebp
mov ebp, esp
# Ez a kettő elmenti az "ebp" regiszter tartalmát a stack-be és feltölti az ebp-t az esp regiszterből. Ezzel létrehoz egy pointer-t az úgynevezett stack-frame-re, amit most nem magyarázok el. Ebben a pici programban nincs rá szükség valójában.

push offset hello_world
# A "hello_world" memóriacímet (offszetet) berakja a stack-be, ez a szubrutinhívás első (és most egyetlen) paramétere. A többi paraméter is push-sal menne be, ha volna.

call printf
# meghívja a printf-et

pop eax
# kiszedi a stack-ből az előb be-push-olt értéket (offset hello_world). Lehetne az is, hogy "add esp,4"

mov eax, 0
# nullát tesz az eax-ba; ez lesz a szubrutin visszatérési értéke a ret-kor

mov esp, ebp
pop ebp
# ez a kettő visszacsinálja a stack frame-et

ret
# végül visszatér a szubrutin.
0