Jump to content
dizzy

ASM (Assembler)

Recommended Posts

Salutare voua cei insetati de asm. Asm e cel mai apropiat de sistem limbaj care exista (din cate stiu eu). Multora li se pare super complicat si de aia m-am gandit sa incep asa usor usor .. cu un tutorial ... si .. deocamdata ma gandesc sa fac si part 2 si 3 si etc ... dar sa vad ce timp am .. oricum .. here is part 1 i guess:

Ce vom invata aici :

- utilizarea unor functii DOS pentru afisarea pe ecran a unor mesaje;

- evaluarea unor expresii aritmetice folosind operanzi intregi pe octet(byte) si pe cuvant (word)

1. Un program pentru afisarea unui mesaj pe ecran.

a) format .EXE

se va folosi functia de afisare pe ecran 40h

functia scrie intr-un fisier sau pe un device

Parametrii (sa zicem asa)

* BX = identificatorul fisierului

* CX = numarul de octeti de scris

* DS:DX -> textul (datele)

4C00h este functia de exit din program

Int21h e intrerupere dos pentru executarea functiilor.


.MODEL SMALL (modelul de memorie folosit)
.STACK 100h (rezervam o stiva de 100h (256 in decimal)
.DATA (incepe zona de date)

mesaj DB ‘Salut!’, 13, 10 (mesajul nostru terminat in crlf (13, 10)
lmesaj EQU $-mesaj (lungimea mesajului)

.CODE (zona de cod)
start: mov ax, @DATA
mov ds, ax
mov bx,1
mov cx, lmesaj
mov dx, OFFSET mesaj
mov ah, 40h
int 21h
mov ax, 4C00h
int 21h
END start

format-ul COM este destul de diferit de EXE. el este in principiu o imagine a memoriei (un segment de memorie).

B) format .COM


_text SEGMENT

ORG 100h
ASSUME cs:_text, ds:_text, es:_text, ss:_text

start: jmp inceput

mesaj DB ‘Salut!’, 13, 10
lmesaj EQU $-mesaj

inceput: mov bx,1
mov cx, lmesaj
mov dx, OFFSET mesaj
mov ah, 40h
int 21h
mov ax, 4C00h
int 21h
_text ENDS
END start

2. Evaluare expresii:

yy=x+y-24+z


data SEGMENT
x DB -33 (se dau valorile, in decimal, octal si binar)
y DB 14o
z DB 110101b
yy DB ?
data ENDS

cod SEGMENT
ASSUME cs: cod, ds: data, ss:data
start: mov ax, data
mov ds,ax
mov al,x
add al,y (adaugare)
sub al, 24 (scadere)
add al, z (adaugare)
mov yy, al
mov ax, 4C00h
int 21h
cod ENDS
END start

In acest ultim exemplu s-au folosit segmente de memorie (dupa cum se observa) . Ele trebuie inchise cu "<numesegment> ENDS". iar label-urile (start .. etc) trebuie inchise cu "END <numelabel>"

dupa cum observati in toate se gaseste:

mov ax, data

mov ds,ax

asta deoarece ds (data segment) trebuie sa pointeze spre zona de date

Dupa cum vedeti nu este un tutorial mura in gura, las la latitudinea celor interesati sa citeasca despre ASSUME, despre MOV, ADD , SUB (sunt foarte usoare) si restul chestiilor care nu le-am prezentat.

NU este un tutorial pentru incepatori in programare, este un tutorial pentru incepatori in ASM.

Daca cineva vede ca am gresit ceva, il rog sa corecteze.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...