<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Asamblare - All Forums]]></title>
		<link>http://asm.natea.ro/</link>
		<description><![CDATA[Asamblare - http://asm.natea.ro]]></description>
		<pubDate>Thu, 29 Oct 2026 03:30:18 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Cautare nr de subsiruri]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=10</link>
			<pubDate>Tue, 06 Nov 2018 22:56:59 +0200</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=10</guid>
			<description><![CDATA[presupunem ca avem sir sursa: ABBABBACBAB si vrem sa verificam de cate ori apare subsirul: AB     =&gt; 3 ori<br />
<br />
<br />
<br />
<br />
<br />
.model small<br />
.stack 100<br />
.data   <br />
sirSursa       db  'ABBABBACBAB'<br />
dimSirSursa     equ &#36;-sirSursa<br />
sirCautat      db  'AB'<br />
dimSirCautat   equ &#36;-sirCautat<br />
<br />
<br />
loc_offsetCurent   dw  0<br />
loc_numarPotriviri dw  0<br />
<br />
text1 db 'Numarul de aparitii: &#36;'<br />
<br />
.code<br />
<br />
; pasam prin al caracterul cautat<br />
; pasam prin bx offsetul catre sirul sursa din segmentul curent<br />
; pasam prin cx dimensiunea sirului<br />
; returnam prin ax offsetul la care a fost gasit<br />
;    caracterul sau -1 daca nu a fost gasit<br />
<br />
; // ax cautaOffsetCaracter(al, bx, cx)<br />
; int cautaOffsetCaracter(char carCautat, char *sir, int lungime)<br />
; {<br />
;    int i = 0;<br />
;    char gasit = 0;  ; // zero flag<br />
;<br />
;    for (i = 0; i &lt; lungime; ++i)<br />
;    {<br />
;       if (sir[i] == carCautat)<br />
;       {<br />
;           gasit = 1;<br />
;           break;<br />
;       }<br />
;    }<br />
;<br />
;    if (gasit == 1)<br />
;    {<br />
;       return lungime - i; // ax = lungime - i<br />
;    }<br />
;    else<br />
;    {<br />
;       return -1; // ax = -1 (0xFFFF)<br />
;    }<br />
;     <br />
; }<br />
cautaOffsetCaracter proc<br />
    push di ; salvam registrii folositi si modificati<br />
    push cx<br />
    push dx<br />
    <br />
    mov dx, cx<br />
    mov di, bx<br />
    <br />
    repne scasb<br />
    <br />
    jz gasit_car        ; verificam daca ultima potrivire a fost ok.<br />
    <br />
    mov ax, 0FFFFh      ; returnam -1<br />
    jmp sfarsit_cautare<br />
    <br />
  gasit_car:<br />
    sub dx, cx          ; calculam offsetul din lugimea intiala<br />
    dec dx              ; vrem ca offsetul sa inceapa de la 0, nu 1<br />
    mov ax, dx          ; returnam offsetul la care a fost gasit caracterul<br />
    <br />
  sfarsit_cautare:<br />
    pop dx<br />
    pop cx<br />
    pop di<br />
    ret<br />
cautaOffsetCaracter endp<br />
<br />
<br />
; pasam prin ax sirul cautat<br />
; pasam prin bx sirul sursa<br />
; pasam prin cx dimensiunea sirului<br />
; returnam prin ax dimensiunea potrivirii<br />
;    csau -1 daca sirurile difera<br />
<br />
; // ax verificaPotrivire(ax, bx, cx)<br />
; int verificaPotrivire(char *sirCautat, char *sirSursa, int lungime)<br />
verificaPotrivire proc<br />
    push si<br />
    push di<br />
    push cx<br />
    push dx<br />
    <br />
    mov dx, cx<br />
    mov si, ax<br />
    mov di, bx<br />
    <br />
    repe cmpsb<br />
    <br />
    jz potrivire<br />
    <br />
    mov dx, 0FFFFh<br />
    <br />
  potrivire:<br />
    mov ax, dx<br />
    pop dx<br />
    pop cx<br />
    pop di<br />
    pop si<br />
    ret<br />
verificaPotrivire endp<br />
<br />
<br />
; returnam prin ax numarul de ori in care sirCautat se regaseste in sirSursa<br />
cautaNrPotriviri proc<br />
<br />
   ; seteaza date initiale <br />
   ; folosim globale, desi am putea-o face si pe stiva<br />
   mov  loc_numarPotriviri, 0   ; numar potriviri<br />
   mov  loc_offsetCurent,   0   ; offset curent in sirSursa; initial 0<br />
   <br />
 reia:<br />
   <br />
   mov  al, sirCautat        ; cautam sir2[0] : 'A'<br />
   mov  bx, offset sirSursa  ; cautam in sir1 : 'ABBABBABA'<br />
   mov  cx, dimSirSursa      ; pt intreaga dimensiune a sirului : 9<br />
   <br />
   add  bx, loc_offsetCurent ; muta indexul in sirul sursa la offsetul curent<br />
   sub  cx, loc_offsetCurent ; seteaza cx conform cu numarul ramas de caractere.<br />
   <br />
   call cautaOffsetCaracter<br />
   <br />
   ; verifica daca functia a returnat -1 sau un offset valid.<br />
   cmp  ax, 0FFFFh<br />
   jz terminat     ; daca functia a returnat -1 am terminat cautarea<br />
   <br />
   ; daca nu, actualizam offsetul<br />
   add  loc_offsetCurent, ax      ; actualizeaza offsetul curent<br />
   <br />
   ; si verificam daca exista o potrivire incepand de la offsetul curent<br />
   mov  ax, offset sirCautat  ; cautam sirul 2 : 'AB'<br />
   mov  bx, offset sirSursa   ; cautam in sir1 : 'ABBABBABA'<br />
   add  bx, loc_offsetCurent  ;      de la offsetul curent<br />
   mov  cx, dimSirCautat      ; pt dimensiunea celui de'al doilea sir : 2<br />
   <br />
   call verificaPotrivire<br />
   <br />
   ; verifica daca sirurile sunt identice<br />
   cmp  ax, 0FFFFh<br />
   jnz potrivire_gasita<br />
   ; daca nu sunt, ne mutam pur si simplu pe urmatorul caracter si reluam verificariile<br />
   add  loc_offsetCurent, 1<br />
   jmp reia<br />
   <br />
 potrivire_gasita:<br />
   ; daca sunt identice, ne mutam dupa  potrivire<br />
   add  loc_offsetCurent, ax<br />
   inc  loc_numarPotriviri<br />
   jmp  reia<br />
   <br />
 terminat:<br />
   mov  ax, loc_numarPotriviri<br />
   ret<br />
cautaNrPotriviri endp<br />
<br />
start:<br />
   mov  ax, @data<br />
   mov  ds, ax<br />
   mov  es, ax<br />
<br />
   ; afisare mesaj rezultat: <br />
   mov  ah, 9<br />
   lea  dx, text1<br />
   int  21h<br />
<br />
   call cautaNrPotriviri<br />
   <br />
   mov  dx, ax  ; pune rezultatul cautariilor in dx; <br />
   add  dx, '0' ; transforma rezultatul din dx in ascii [presupunem ca e doar o valoarea intre 0 si 9]<br />
   <br />
   mov  ah, 2h  ; dos 21h: 'Write character to STDOUT' ; continutul lui dl<br />
   int  21h<br />
   <br />
   ; procedura exit<br />
   mov  ah, 4ch<br />
   int  21h<br />
   end start<br />
   <br />
end start]]></description>
			<content:encoded><![CDATA[presupunem ca avem sir sursa: ABBABBACBAB si vrem sa verificam de cate ori apare subsirul: AB     =&gt; 3 ori<br />
<br />
<br />
<br />
<br />
<br />
.model small<br />
.stack 100<br />
.data   <br />
sirSursa       db  'ABBABBACBAB'<br />
dimSirSursa     equ &#36;-sirSursa<br />
sirCautat      db  'AB'<br />
dimSirCautat   equ &#36;-sirCautat<br />
<br />
<br />
loc_offsetCurent   dw  0<br />
loc_numarPotriviri dw  0<br />
<br />
text1 db 'Numarul de aparitii: &#36;'<br />
<br />
.code<br />
<br />
; pasam prin al caracterul cautat<br />
; pasam prin bx offsetul catre sirul sursa din segmentul curent<br />
; pasam prin cx dimensiunea sirului<br />
; returnam prin ax offsetul la care a fost gasit<br />
;    caracterul sau -1 daca nu a fost gasit<br />
<br />
; // ax cautaOffsetCaracter(al, bx, cx)<br />
; int cautaOffsetCaracter(char carCautat, char *sir, int lungime)<br />
; {<br />
;    int i = 0;<br />
;    char gasit = 0;  ; // zero flag<br />
;<br />
;    for (i = 0; i &lt; lungime; ++i)<br />
;    {<br />
;       if (sir[i] == carCautat)<br />
;       {<br />
;           gasit = 1;<br />
;           break;<br />
;       }<br />
;    }<br />
;<br />
;    if (gasit == 1)<br />
;    {<br />
;       return lungime - i; // ax = lungime - i<br />
;    }<br />
;    else<br />
;    {<br />
;       return -1; // ax = -1 (0xFFFF)<br />
;    }<br />
;     <br />
; }<br />
cautaOffsetCaracter proc<br />
    push di ; salvam registrii folositi si modificati<br />
    push cx<br />
    push dx<br />
    <br />
    mov dx, cx<br />
    mov di, bx<br />
    <br />
    repne scasb<br />
    <br />
    jz gasit_car        ; verificam daca ultima potrivire a fost ok.<br />
    <br />
    mov ax, 0FFFFh      ; returnam -1<br />
    jmp sfarsit_cautare<br />
    <br />
  gasit_car:<br />
    sub dx, cx          ; calculam offsetul din lugimea intiala<br />
    dec dx              ; vrem ca offsetul sa inceapa de la 0, nu 1<br />
    mov ax, dx          ; returnam offsetul la care a fost gasit caracterul<br />
    <br />
  sfarsit_cautare:<br />
    pop dx<br />
    pop cx<br />
    pop di<br />
    ret<br />
cautaOffsetCaracter endp<br />
<br />
<br />
; pasam prin ax sirul cautat<br />
; pasam prin bx sirul sursa<br />
; pasam prin cx dimensiunea sirului<br />
; returnam prin ax dimensiunea potrivirii<br />
;    csau -1 daca sirurile difera<br />
<br />
; // ax verificaPotrivire(ax, bx, cx)<br />
; int verificaPotrivire(char *sirCautat, char *sirSursa, int lungime)<br />
verificaPotrivire proc<br />
    push si<br />
    push di<br />
    push cx<br />
    push dx<br />
    <br />
    mov dx, cx<br />
    mov si, ax<br />
    mov di, bx<br />
    <br />
    repe cmpsb<br />
    <br />
    jz potrivire<br />
    <br />
    mov dx, 0FFFFh<br />
    <br />
  potrivire:<br />
    mov ax, dx<br />
    pop dx<br />
    pop cx<br />
    pop di<br />
    pop si<br />
    ret<br />
verificaPotrivire endp<br />
<br />
<br />
; returnam prin ax numarul de ori in care sirCautat se regaseste in sirSursa<br />
cautaNrPotriviri proc<br />
<br />
   ; seteaza date initiale <br />
   ; folosim globale, desi am putea-o face si pe stiva<br />
   mov  loc_numarPotriviri, 0   ; numar potriviri<br />
   mov  loc_offsetCurent,   0   ; offset curent in sirSursa; initial 0<br />
   <br />
 reia:<br />
   <br />
   mov  al, sirCautat        ; cautam sir2[0] : 'A'<br />
   mov  bx, offset sirSursa  ; cautam in sir1 : 'ABBABBABA'<br />
   mov  cx, dimSirSursa      ; pt intreaga dimensiune a sirului : 9<br />
   <br />
   add  bx, loc_offsetCurent ; muta indexul in sirul sursa la offsetul curent<br />
   sub  cx, loc_offsetCurent ; seteaza cx conform cu numarul ramas de caractere.<br />
   <br />
   call cautaOffsetCaracter<br />
   <br />
   ; verifica daca functia a returnat -1 sau un offset valid.<br />
   cmp  ax, 0FFFFh<br />
   jz terminat     ; daca functia a returnat -1 am terminat cautarea<br />
   <br />
   ; daca nu, actualizam offsetul<br />
   add  loc_offsetCurent, ax      ; actualizeaza offsetul curent<br />
   <br />
   ; si verificam daca exista o potrivire incepand de la offsetul curent<br />
   mov  ax, offset sirCautat  ; cautam sirul 2 : 'AB'<br />
   mov  bx, offset sirSursa   ; cautam in sir1 : 'ABBABBABA'<br />
   add  bx, loc_offsetCurent  ;      de la offsetul curent<br />
   mov  cx, dimSirCautat      ; pt dimensiunea celui de'al doilea sir : 2<br />
   <br />
   call verificaPotrivire<br />
   <br />
   ; verifica daca sirurile sunt identice<br />
   cmp  ax, 0FFFFh<br />
   jnz potrivire_gasita<br />
   ; daca nu sunt, ne mutam pur si simplu pe urmatorul caracter si reluam verificariile<br />
   add  loc_offsetCurent, 1<br />
   jmp reia<br />
   <br />
 potrivire_gasita:<br />
   ; daca sunt identice, ne mutam dupa  potrivire<br />
   add  loc_offsetCurent, ax<br />
   inc  loc_numarPotriviri<br />
   jmp  reia<br />
   <br />
 terminat:<br />
   mov  ax, loc_numarPotriviri<br />
   ret<br />
cautaNrPotriviri endp<br />
<br />
start:<br />
   mov  ax, @data<br />
   mov  ds, ax<br />
   mov  es, ax<br />
<br />
   ; afisare mesaj rezultat: <br />
   mov  ah, 9<br />
   lea  dx, text1<br />
   int  21h<br />
<br />
   call cautaNrPotriviri<br />
   <br />
   mov  dx, ax  ; pune rezultatul cautariilor in dx; <br />
   add  dx, '0' ; transforma rezultatul din dx in ascii [presupunem ca e doar o valoarea intre 0 si 9]<br />
   <br />
   mov  ah, 2h  ; dos 21h: 'Write character to STDOUT' ; continutul lui dl<br />
   int  21h<br />
   <br />
   ; procedura exit<br />
   mov  ah, 4ch<br />
   int  21h<br />
   end start<br />
   <br />
end start]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Concatenare siruri]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=9</link>
			<pubDate>Wed, 31 Oct 2018 23:29:35 +0200</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=9</guid>
			<description><![CDATA[.model small<br />
.stack 100<br />
.data<br />
    text3 db '&#36;'<br />
    lenText3 equ &#36; - text3<br />
    text2 db 'World'<br />
    lenText2 equ &#36; - text2<br />
    text1 db 'Hello '<br />
    lenText1 equ &#36; - text1<br />
    buffer db 100 dup(0)<br />
.code<br />
; param [in] si  sursa<br />
; param [in] di  destinatie<br />
; param [in] cx  lungime<br />
; datele de intrare sunt restaurate la iesirea din procedura<br />
copy proc<br />
    push si<br />
    push di<br />
    push cx<br />
    cld<br />
    rep movsb<br />
    pop cx<br />
    pop di<br />
    pop si<br />
    ret<br />
copy endp<br />
<br />
start:<br />
    mov ax, @data<br />
    mov ds, ax<br />
    mov es, ax<br />
<br />
    cld                         ; setam directia decopiere<br />
    mov si, offset text1  ; setam sursa<br />
    mov di, offset buffer ; setam destinatia<br />
    mov cx, lenText1     ; setam numarul de caractere ce urmeaza a fi copiate<br />
    rep movsb              ; copiem <br />
    ; buffer = Hello<br />
<br />
    ; Concatenam: "World" la textul anterior<br />
    mov si, offset text2  ; setam sursa<br />
    ; destinatia ramane nemodificata. a fost actualizata de instructiunea anterioara: 'movsb'<br />
    mov cx, lenText2    ; setam numarul de caractere ce urmeaza a fi copiate<br />
    rep movsb             ; copiem <br />
    ; buffer = Hello World<br />
<br />
<br />
    ; Concatenam: "&#36;" / caracter  terminal pt prin string<br />
    mov si, offset text3  ; sursa<br />
    ; destinatie ramane di<br />
    mov cx, lenText3    ; setam numarul de caractere ce urmeaza a fi copiate<br />
    call copy                ; apelam o metoda de copiere<br />
    ; buffer = Hello World&#36;<br />
<br />
<br />
    ; afisam datele copiate<br />
    mov ah, 9<br />
    lea dx, buffer<br />
    int 21h<br />
<br />
    ; rutina exit<br />
    mov ah, 4ch<br />
    int 21h<br />
<br />
end start]]></description>
			<content:encoded><![CDATA[.model small<br />
.stack 100<br />
.data<br />
    text3 db '&#36;'<br />
    lenText3 equ &#36; - text3<br />
    text2 db 'World'<br />
    lenText2 equ &#36; - text2<br />
    text1 db 'Hello '<br />
    lenText1 equ &#36; - text1<br />
    buffer db 100 dup(0)<br />
.code<br />
; param [in] si  sursa<br />
; param [in] di  destinatie<br />
; param [in] cx  lungime<br />
; datele de intrare sunt restaurate la iesirea din procedura<br />
copy proc<br />
    push si<br />
    push di<br />
    push cx<br />
    cld<br />
    rep movsb<br />
    pop cx<br />
    pop di<br />
    pop si<br />
    ret<br />
copy endp<br />
<br />
start:<br />
    mov ax, @data<br />
    mov ds, ax<br />
    mov es, ax<br />
<br />
    cld                         ; setam directia decopiere<br />
    mov si, offset text1  ; setam sursa<br />
    mov di, offset buffer ; setam destinatia<br />
    mov cx, lenText1     ; setam numarul de caractere ce urmeaza a fi copiate<br />
    rep movsb              ; copiem <br />
    ; buffer = Hello<br />
<br />
    ; Concatenam: "World" la textul anterior<br />
    mov si, offset text2  ; setam sursa<br />
    ; destinatia ramane nemodificata. a fost actualizata de instructiunea anterioara: 'movsb'<br />
    mov cx, lenText2    ; setam numarul de caractere ce urmeaza a fi copiate<br />
    rep movsb             ; copiem <br />
    ; buffer = Hello World<br />
<br />
<br />
    ; Concatenam: "&#36;" / caracter  terminal pt prin string<br />
    mov si, offset text3  ; sursa<br />
    ; destinatie ramane di<br />
    mov cx, lenText3    ; setam numarul de caractere ce urmeaza a fi copiate<br />
    call copy                ; apelam o metoda de copiere<br />
    ; buffer = Hello World&#36;<br />
<br />
<br />
    ; afisam datele copiate<br />
    mov ah, 9<br />
    lea dx, buffer<br />
    int 21h<br />
<br />
    ; rutina exit<br />
    mov ah, 4ch<br />
    int 21h<br />
<br />
end start]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Aplicatie]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=8</link>
			<pubDate>Wed, 31 Oct 2018 22:20:53 +0200</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=8</guid>
			<description><![CDATA[Se citesc 2 caractere in hexa: ex. FF<br />
Programul va afisa rezultatul: ex. 255<br />
<br />
<br />
.model small<br />
.stack 100<br />
.data   <br />
text1 db 10, 13, 'Introduceti un numar in hexa: &#36;'<br />
text2 db 10, 13, 'Rezultat: &#36;'<br />
text3 db 10, 13, 'Caracter invalid, introdu altul: &#36;'<br />
.code<br />
ascii_to_hex proc<br />
   push dx<br />
   cmp  al, '0'<br />
   jb eroare<br />
   <br />
   cmp  al, '9'<br />
   jb interval_0_9<br />
   <br />
   cmp  al, 'A'<br />
   jb eroare<br />
   <br />
   cmp  al, 'F'<br />
   jbe interval_A_F_uppercase<br />
   <br />
   cmp  al, 'a'<br />
   jb eroare<br />
   <br />
   cmp  al, 'f'<br />
   jbe interval_a_f_lowercase<br />
   <br />
eroare:<br />
   ; afisare: Caracter invalid <br />
   mov ah, 9<br />
   lea dx, text3<br />
   int  21h<br />
   <br />
   ; setam valoarea 0<br />
   mov al, 10h<br />
   jmp done<br />
interval_a_f_lowercase:<br />
   sub al, 87 ; 'A' - 10<br />
   jmp done<br />
interval_A_F_uppercase:<br />
   sub al, 55 ; 'A' - 10<br />
   jmp done<br />
   <br />
interval_0_9:<br />
   sub al, '0'<br />
   jmp done<br />
done:<br />
   pop dx<br />
   ret<br />
ascii_to_hex endp<br />
<br />
citeste_hex proc<br />
introdu_alt_nr:<br />
   mov ah, 1<br />
   int 21h<br />
   call ascii_to_hex   <br />
  <br />
   cmp al, 10h <br />
   jae introdu_alt_nr<br />
   ret<br />
citeste_hex endp<br />
start:<br />
   mov  ax, @data<br />
   mov  ds, ax<br />
   ; afisare: Introduceti un numar in hexa: <br />
   mov ah, 9<br />
   lea dx, text1<br />
   int  21h<br />
   ; citire caracter1<br />
   call citeste_hex <br />
   mov bl, al  ; salvam rezultatul in bl<br />
   shl bl, 4   ; mutam rezultatul in partea high a bl<br />
      <br />
   ; citire caracter2<br />
   call citeste_hex   <br />
   or bl, al   ; bl = bl | al;<br />
   <br />
   <br />
   mov cx, 0<br />
   mov al, bl <br />
   mov dx, 0<br />
   <br />
reia:   <br />
   mov ah, 0  <br />
   mov dl, 10<br />
   div dl     ; impartim la 10<br />
   mov dl, ah ; salvam restul impartirii in dl<br />
   push dx    ; salvam restul impartirii pe stiva<br />
   inc cx     ; salvam numarul de caractere impinse pe stiva<br />
   cmp al, 0<br />
   jne reia<br />
   ; in principiu daca numarul intial era 126, <br />
   ; pe stiva am fi pus : 6 2 1 iar in cx am avea valoarea 3<br />
   <br />
   ; afisare: Rezultat<br />
   mov ah, 9<br />
   lea dx, text2<br />
   int  21h<br />
   <br />
afiseaza_rez:<br />
   pop dx     ; pop de pe stiva a resturilor / 'in ordine inversa'<br />
   add dl, 48 ; dl + '0' conversie in ascii<br />
   mov ah, 2<br />
   int 21h<br />
loop afiseaza_rez<br />
   <br />
   ; procedura exit<br />
   mov ah, 4ch<br />
   int  21h<br />
   end start<br />
   <br />
end start]]></description>
			<content:encoded><![CDATA[Se citesc 2 caractere in hexa: ex. FF<br />
Programul va afisa rezultatul: ex. 255<br />
<br />
<br />
.model small<br />
.stack 100<br />
.data   <br />
text1 db 10, 13, 'Introduceti un numar in hexa: &#36;'<br />
text2 db 10, 13, 'Rezultat: &#36;'<br />
text3 db 10, 13, 'Caracter invalid, introdu altul: &#36;'<br />
.code<br />
ascii_to_hex proc<br />
   push dx<br />
   cmp  al, '0'<br />
   jb eroare<br />
   <br />
   cmp  al, '9'<br />
   jb interval_0_9<br />
   <br />
   cmp  al, 'A'<br />
   jb eroare<br />
   <br />
   cmp  al, 'F'<br />
   jbe interval_A_F_uppercase<br />
   <br />
   cmp  al, 'a'<br />
   jb eroare<br />
   <br />
   cmp  al, 'f'<br />
   jbe interval_a_f_lowercase<br />
   <br />
eroare:<br />
   ; afisare: Caracter invalid <br />
   mov ah, 9<br />
   lea dx, text3<br />
   int  21h<br />
   <br />
   ; setam valoarea 0<br />
   mov al, 10h<br />
   jmp done<br />
interval_a_f_lowercase:<br />
   sub al, 87 ; 'A' - 10<br />
   jmp done<br />
interval_A_F_uppercase:<br />
   sub al, 55 ; 'A' - 10<br />
   jmp done<br />
   <br />
interval_0_9:<br />
   sub al, '0'<br />
   jmp done<br />
done:<br />
   pop dx<br />
   ret<br />
ascii_to_hex endp<br />
<br />
citeste_hex proc<br />
introdu_alt_nr:<br />
   mov ah, 1<br />
   int 21h<br />
   call ascii_to_hex   <br />
  <br />
   cmp al, 10h <br />
   jae introdu_alt_nr<br />
   ret<br />
citeste_hex endp<br />
start:<br />
   mov  ax, @data<br />
   mov  ds, ax<br />
   ; afisare: Introduceti un numar in hexa: <br />
   mov ah, 9<br />
   lea dx, text1<br />
   int  21h<br />
   ; citire caracter1<br />
   call citeste_hex <br />
   mov bl, al  ; salvam rezultatul in bl<br />
   shl bl, 4   ; mutam rezultatul in partea high a bl<br />
      <br />
   ; citire caracter2<br />
   call citeste_hex   <br />
   or bl, al   ; bl = bl | al;<br />
   <br />
   <br />
   mov cx, 0<br />
   mov al, bl <br />
   mov dx, 0<br />
   <br />
reia:   <br />
   mov ah, 0  <br />
   mov dl, 10<br />
   div dl     ; impartim la 10<br />
   mov dl, ah ; salvam restul impartirii in dl<br />
   push dx    ; salvam restul impartirii pe stiva<br />
   inc cx     ; salvam numarul de caractere impinse pe stiva<br />
   cmp al, 0<br />
   jne reia<br />
   ; in principiu daca numarul intial era 126, <br />
   ; pe stiva am fi pus : 6 2 1 iar in cx am avea valoarea 3<br />
   <br />
   ; afisare: Rezultat<br />
   mov ah, 9<br />
   lea dx, text2<br />
   int  21h<br />
   <br />
afiseaza_rez:<br />
   pop dx     ; pop de pe stiva a resturilor / 'in ordine inversa'<br />
   add dl, 48 ; dl + '0' conversie in ascii<br />
   mov ah, 2<br />
   int 21h<br />
loop afiseaza_rez<br />
   <br />
   ; procedura exit<br />
   mov ah, 4ch<br />
   int  21h<br />
   end start<br />
   <br />
end start]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Tema]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=7</link>
			<pubDate>Thu, 25 Oct 2018 09:46:27 +0300</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=7</guid>
			<description><![CDATA[Problema1:<br />
Se vor citi de la tastatura 2 caractere reprezentand un numar decimal. (=&gt; caractere posibile: '0123456789')<br />
Se va afisa ca rezultat valoarea hexadecimala.<br />
<br />
exemplu: <br />
   Introduceti valoarea: 32<br />
   Rezultatule este: 0x20<br />
<br />
<br />
Parcurs pobleme ramase in 'lucrarea 4']]></description>
			<content:encoded><![CDATA[Problema1:<br />
Se vor citi de la tastatura 2 caractere reprezentand un numar decimal. (=&gt; caractere posibile: '0123456789')<br />
Se va afisa ca rezultat valoarea hexadecimala.<br />
<br />
exemplu: <br />
   Introduceti valoarea: 32<br />
   Rezultatule este: 0x20<br />
<br />
<br />
Parcurs pobleme ramase in 'lucrarea 4']]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Linkuri utile]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=6</link>
			<pubDate>Mon, 22 Oct 2018 23:21:02 +0300</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=6</guid>
			<description><![CDATA[<a href="https://en.wikipedia.org/wiki/Intel_8086" target="_blank" rel="noopener" class="mycode_url">Arhitectura 8086</a><br />
<br />
<a href="http://spike.scu.edu.au/~barry/interrupts.html" target="_blank" rel="noopener" class="mycode_url">Dos Interrupts (int 21h)</a>]]></description>
			<content:encoded><![CDATA[<a href="https://en.wikipedia.org/wiki/Intel_8086" target="_blank" rel="noopener" class="mycode_url">Arhitectura 8086</a><br />
<br />
<a href="http://spike.scu.edu.au/~barry/interrupts.html" target="_blank" rel="noopener" class="mycode_url">Dos Interrupts (int 21h)</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Aplicatii]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=5</link>
			<pubDate>Mon, 22 Oct 2018 21:49:26 +0300</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=5</guid>
			<description><![CDATA[<span style="font-family: Consolas;" class="mycode_font">.model small<br />
.stack 100<br />
.data<br />
tabel db 1, 2, 3, 4, 5, 11 dup (?)<br />
numar1 dd 145A789Fh<br />
numar2 dd 92457ABCh<br />
<br />
numarbcd1 dw 1234h<br />
numarbcd2 dw 5678h<br />
<br />
numarbcddesp1 dw 0102h<br />
numarbcddesp2 dw 0009h<br />
<br />
asciiTable db '0123456789ABCDEF'<br />
.code<br />
<br />
; ne astepam ca in ax sa avem un numar in BCD impachetat<br />
; de exemplu 0x1234 =&gt; printam 1234<br />
afisWord proc<br />
   push cx<br />
   mov cx, 4<br />
 reiaAfis:<br />
   rol ax, 4         ; mutam cei mai semnificativi 4 biti pe ultima pozitie<br />
   call afisareCaracter<br />
   ; sau precum ati vrut: loop cx<br />
   dec cx<br />
   cmp cx, 0 <br />
   jnz reiaAfis    <br />
; rotatie completa =&gt; nu e nevoie sa salvam ax<br />
pop cx<br />
ret<br />
afisWord endp<br />
<br />
; ne astepam ca in ax sa avem un numar in BCD despachetat<br />
; de exemplu 0x0108 =&gt; printam 18<br />
afisWordDesp proc<br />
   push cx<br />
   mov cx, 2<br />
 reiaAfisWord:<br />
   rol ax, 8         ; mutam cei mai semnificativi 8 biti pe ultima pozitie <br />
   call afisareCaracter<br />
   loop reiaAfisWord<br />
   ; rotatie completa =&gt; nu e nevoie sa salvam ax<br />
   pop cx<br />
ret<br />
afisWordDesp endp<br />
<br />
afisareCaracter proc<br />
   push ax<br />
   push bx<br />
   push dx<br />
   lea bx, asciiTable<br />
   and al, 0Fh   ; folosim o masca pt a pastra doar ultimii octeti<br />
   xlat          ; luam in al caracterul ascii din asciiTable al &lt;- ds:[bx+al];<br />
   mov ah, 2h    ; dos 21h: 'Write character to STDOUT'<br />
   mov dl, al<br />
   int 21h<br />
   pop dx        ; restauram registrii<br />
   pop bx<br />
   pop ax<br />
   ret<br />
afisareCaracter endp<br />
<br />
start:<br />
   mov ax, @data<br />
   mov ds, ax<br />
<br />
   ; random<br />
   mov ax, 12h<br />
   mov bx, 0h<br />
   not ax<br />
   and bx, ax<br />
<br />
   ; aplicatia 1<br />
   mov al, 10011110b<br />
   mov cl, 3<br />
   rol al, cl<br />
<br />
   ; aplicatia 2<br />
   mov bx, sp<br />
   mov cx, 2134h<br />
   push cx<br />
   mov byte ptr ss:[bx-2], 22h<br />
   pop cx<br />
<br />
   ; aplicatia 3<br />
   mov cl, 4<br />
   mov ax, 0702h<br />
   shl al, cl<br />
   shr ax, cl<br />
<br />
   ; aplicatia 4<br />
   mov cx, 1234H<br />
   push cx<br />
   mov bx, 2359h<br />
   push bx<br />
   mov ax, 4257h<br />
   mov bp, sp<br />
   mov byte ptr [bp], al<br />
   pop ax<br />
<br />
   ; aplicatia 5<br />
   ; incarcam partea low din numere si le adunam<br />
   mov cx, word ptr numar1  <br />
   add cx, word ptr numar2      ; rezultatul adunarii pastrat in cx<br />
   <br />
   ; incarcam partea high din numere si le adunam tinand cont de cary flag<br />
   mov bx, word ptr numar1[2]<br />
   adc bx, word ptr numar2[2]   ; rezultatul adunarii pastrat in bx<br />
<br />
   ; afisam partea high, pastrata in bx<br />
   mov ax, bx<br />
   call afisWord<br />
<br />
   ; afisam partea low, pastrata in cx<br />
   mov ax, cx<br />
   call afisWord<br />
   <br />
   ; rand nou<br />
   mov ah, 2h    ; dos 21h: 'Write character to STDOUT'<br />
   mov dl, 10    ; '\r'<br />
   int 21h<br />
   mov dl, 13    ; '\n' ... sau invers<br />
   int 21h<br />
<br />
   ; aplicatia 6<br />
   mov al, byte ptr numarbcd1    ; copiem partea low in al 0x34<br />
   mov bl, byte ptr numarbcd2    ; copiem partea low in bl 0x78<br />
   add al, bl                    ; al = 0x34+0x78 = 0xAC =&gt; numar ce nu e valid in BCD<br />
   daa                           ; ajustam rezultatul =&gt; 112 =&gt; CF = 1 si al=12 <br />
   mov cl, al                    ; salvam rezultatul in cl<br />
   mov al, byte ptr numarbcd1[1] ; copiem partea high in al<br />
   mov bl, byte ptr numarbcd2[1] ; copiem partea high in bl<br />
   adc al, bl                    ; al = al + bl + CF = 0x12+0x56 + 0x1 = 0x69<br />
   daa                           ; ajustam rezultatul =&gt; 0x69<br />
   mov ch, al                    ; salvam rezultatul in ch<br />
<br />
   ; afisam numarul<br />
   mov ax, cx<br />
   call afisWord<br />
<br />
   mov ah, 4ch<br />
   int 21H<br />
end start</span>]]></description>
			<content:encoded><![CDATA[<span style="font-family: Consolas;" class="mycode_font">.model small<br />
.stack 100<br />
.data<br />
tabel db 1, 2, 3, 4, 5, 11 dup (?)<br />
numar1 dd 145A789Fh<br />
numar2 dd 92457ABCh<br />
<br />
numarbcd1 dw 1234h<br />
numarbcd2 dw 5678h<br />
<br />
numarbcddesp1 dw 0102h<br />
numarbcddesp2 dw 0009h<br />
<br />
asciiTable db '0123456789ABCDEF'<br />
.code<br />
<br />
; ne astepam ca in ax sa avem un numar in BCD impachetat<br />
; de exemplu 0x1234 =&gt; printam 1234<br />
afisWord proc<br />
   push cx<br />
   mov cx, 4<br />
 reiaAfis:<br />
   rol ax, 4         ; mutam cei mai semnificativi 4 biti pe ultima pozitie<br />
   call afisareCaracter<br />
   ; sau precum ati vrut: loop cx<br />
   dec cx<br />
   cmp cx, 0 <br />
   jnz reiaAfis    <br />
; rotatie completa =&gt; nu e nevoie sa salvam ax<br />
pop cx<br />
ret<br />
afisWord endp<br />
<br />
; ne astepam ca in ax sa avem un numar in BCD despachetat<br />
; de exemplu 0x0108 =&gt; printam 18<br />
afisWordDesp proc<br />
   push cx<br />
   mov cx, 2<br />
 reiaAfisWord:<br />
   rol ax, 8         ; mutam cei mai semnificativi 8 biti pe ultima pozitie <br />
   call afisareCaracter<br />
   loop reiaAfisWord<br />
   ; rotatie completa =&gt; nu e nevoie sa salvam ax<br />
   pop cx<br />
ret<br />
afisWordDesp endp<br />
<br />
afisareCaracter proc<br />
   push ax<br />
   push bx<br />
   push dx<br />
   lea bx, asciiTable<br />
   and al, 0Fh   ; folosim o masca pt a pastra doar ultimii octeti<br />
   xlat          ; luam in al caracterul ascii din asciiTable al &lt;- ds:[bx+al];<br />
   mov ah, 2h    ; dos 21h: 'Write character to STDOUT'<br />
   mov dl, al<br />
   int 21h<br />
   pop dx        ; restauram registrii<br />
   pop bx<br />
   pop ax<br />
   ret<br />
afisareCaracter endp<br />
<br />
start:<br />
   mov ax, @data<br />
   mov ds, ax<br />
<br />
   ; random<br />
   mov ax, 12h<br />
   mov bx, 0h<br />
   not ax<br />
   and bx, ax<br />
<br />
   ; aplicatia 1<br />
   mov al, 10011110b<br />
   mov cl, 3<br />
   rol al, cl<br />
<br />
   ; aplicatia 2<br />
   mov bx, sp<br />
   mov cx, 2134h<br />
   push cx<br />
   mov byte ptr ss:[bx-2], 22h<br />
   pop cx<br />
<br />
   ; aplicatia 3<br />
   mov cl, 4<br />
   mov ax, 0702h<br />
   shl al, cl<br />
   shr ax, cl<br />
<br />
   ; aplicatia 4<br />
   mov cx, 1234H<br />
   push cx<br />
   mov bx, 2359h<br />
   push bx<br />
   mov ax, 4257h<br />
   mov bp, sp<br />
   mov byte ptr [bp], al<br />
   pop ax<br />
<br />
   ; aplicatia 5<br />
   ; incarcam partea low din numere si le adunam<br />
   mov cx, word ptr numar1  <br />
   add cx, word ptr numar2      ; rezultatul adunarii pastrat in cx<br />
   <br />
   ; incarcam partea high din numere si le adunam tinand cont de cary flag<br />
   mov bx, word ptr numar1[2]<br />
   adc bx, word ptr numar2[2]   ; rezultatul adunarii pastrat in bx<br />
<br />
   ; afisam partea high, pastrata in bx<br />
   mov ax, bx<br />
   call afisWord<br />
<br />
   ; afisam partea low, pastrata in cx<br />
   mov ax, cx<br />
   call afisWord<br />
   <br />
   ; rand nou<br />
   mov ah, 2h    ; dos 21h: 'Write character to STDOUT'<br />
   mov dl, 10    ; '\r'<br />
   int 21h<br />
   mov dl, 13    ; '\n' ... sau invers<br />
   int 21h<br />
<br />
   ; aplicatia 6<br />
   mov al, byte ptr numarbcd1    ; copiem partea low in al 0x34<br />
   mov bl, byte ptr numarbcd2    ; copiem partea low in bl 0x78<br />
   add al, bl                    ; al = 0x34+0x78 = 0xAC =&gt; numar ce nu e valid in BCD<br />
   daa                           ; ajustam rezultatul =&gt; 112 =&gt; CF = 1 si al=12 <br />
   mov cl, al                    ; salvam rezultatul in cl<br />
   mov al, byte ptr numarbcd1[1] ; copiem partea high in al<br />
   mov bl, byte ptr numarbcd2[1] ; copiem partea high in bl<br />
   adc al, bl                    ; al = al + bl + CF = 0x12+0x56 + 0x1 = 0x69<br />
   daa                           ; ajustam rezultatul =&gt; 0x69<br />
   mov ch, al                    ; salvam rezultatul in ch<br />
<br />
   ; afisam numarul<br />
   mov ax, cx<br />
   call afisWord<br />
<br />
   mov ah, 4ch<br />
   int 21H<br />
end start</span>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Aplicatie 4]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=4</link>
			<pubDate>Mon, 22 Oct 2018 21:47:07 +0300</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=4</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>.model small<br />
.stack 100<br />
.data   <br />
adr1 dw 1234h<br />
adr2 dw 5678h<br />
adr3 dw 9012h<br />
adr4 dw 3456h<br />
tabela dd adr1, adr2, adr3, adr4<br />
.code<br />
start: mov  ax, @data<br />
mov  ds, ax<br />
mov cx, 1<br />
mov  bx, cx<br />
add  bx, bx<br />
add bx, bx<br />
les  di, tabela[bx]<br />
mov ax, es:[di]<br />
mov ah, 4ch<br />
int  21h<br />
end start</code></div></div>]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>.model small<br />
.stack 100<br />
.data   <br />
adr1 dw 1234h<br />
adr2 dw 5678h<br />
adr3 dw 9012h<br />
adr4 dw 3456h<br />
tabela dd adr1, adr2, adr3, adr4<br />
.code<br />
start: mov  ax, @data<br />
mov  ds, ax<br />
mov cx, 1<br />
mov  bx, cx<br />
add  bx, bx<br />
add bx, bx<br />
les  di, tabela[bx]<br />
mov ax, es:[di]<br />
mov ah, 4ch<br />
int  21h<br />
end start</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Aplicatie 1]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=3</link>
			<pubDate>Mon, 22 Oct 2018 21:46:09 +0300</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=3</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>.model small<br />
.stack 100 <br />
.data   <br />
tabc db '0123456789ABCDEF' <br />
.code <br />
start: <br />
mov ax,@data   <br />
mov ds,ax   <br />
mov al,0   ;iniţializează AL <br />
repet: <br />
mov bx,offset tabc  ;pune în BX adresa efectivă tabc   <br />
push ax   ;salvează AL în stivă   <br />
xlat    ;pune în AL octetul de la adresa efectivă [BX+AL] <br />
call afisare   ;apelul procedurii afisare   <br />
pop ax   <br />
inc al   <br />
cmp al,10H   ;se verifică dacă s-au afişat toate caracterele   <br />
jz sfarsit   <br />
jmp repet <br />
afisare proc   <br />
mov dl,al   ;pune în DL codul caracterului care trebuie afişat   <br />
mov     ah,2h   ;funcţia DOS pentru afişarea caracterului din DL   <br />
int 21h   <br />
mov dl,' '   <br />
mov     ah,2h   <br />
int 21h <br />
ret ;afisare <br />
endp <br />
sfarsit: <br />
mov ax,4c00h  ;funcţia DOS de ieşire în sistemul de operare   <br />
int 21h   <br />
end start</code></div></div>]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>.model small<br />
.stack 100 <br />
.data   <br />
tabc db '0123456789ABCDEF' <br />
.code <br />
start: <br />
mov ax,@data   <br />
mov ds,ax   <br />
mov al,0   ;iniţializează AL <br />
repet: <br />
mov bx,offset tabc  ;pune în BX adresa efectivă tabc   <br />
push ax   ;salvează AL în stivă   <br />
xlat    ;pune în AL octetul de la adresa efectivă [BX+AL] <br />
call afisare   ;apelul procedurii afisare   <br />
pop ax   <br />
inc al   <br />
cmp al,10H   ;se verifică dacă s-au afişat toate caracterele   <br />
jz sfarsit   <br />
jmp repet <br />
afisare proc   <br />
mov dl,al   ;pune în DL codul caracterului care trebuie afişat   <br />
mov     ah,2h   ;funcţia DOS pentru afişarea caracterului din DL   <br />
int 21h   <br />
mov dl,' '   <br />
mov     ah,2h   <br />
int 21h <br />
ret ;afisare <br />
endp <br />
sfarsit: <br />
mov ax,4c00h  ;funcţia DOS de ieşire în sistemul de operare   <br />
int 21h   <br />
end start</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Setup environment]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=2</link>
			<pubDate>Mon, 22 Oct 2018 21:29:41 +0300</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=2</guid>
			<description><![CDATA[Pasi de instalat DosBox + Bc3.1: <a href="https://www.youtube.com/watch?v=bdLHtvOBjmQ" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=bdLHtvOBjmQ</a>  <br />
<br />
<br />
Borland 3.1: <a href="https://winworldpc.com/product/borland-c/30" target="_blank" rel="noopener" class="mycode_url">https://winworldpc.com/product/borland-c/30</a><br />
DosBox: <a href="https://sourceforge.net/projects/dosbox/files/dosbox/" target="_blank" rel="noopener" class="mycode_url">https://sourceforge.net/projects/dosbox/files/dosbox/</a>]]></description>
			<content:encoded><![CDATA[Pasi de instalat DosBox + Bc3.1: <a href="https://www.youtube.com/watch?v=bdLHtvOBjmQ" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=bdLHtvOBjmQ</a>  <br />
<br />
<br />
Borland 3.1: <a href="https://winworldpc.com/product/borland-c/30" target="_blank" rel="noopener" class="mycode_url">https://winworldpc.com/product/borland-c/30</a><br />
DosBox: <a href="https://sourceforge.net/projects/dosbox/files/dosbox/" target="_blank" rel="noopener" class="mycode_url">https://sourceforge.net/projects/dosbox/files/dosbox/</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Indrumar laborator]]></title>
			<link>http://asm.natea.ro/showthread.php?tid=1</link>
			<pubDate>Mon, 22 Oct 2018 21:22:58 +0300</pubDate>
			<guid isPermaLink="false">http://asm.natea.ro/showthread.php?tid=1</guid>
			<description><![CDATA[Suport laborator<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="http://asm.natea.ro/images/attachtypes/pdf.png" title="Adobe Acrobat PDF" border="0" alt=".pdf" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1" target="_blank" title="">Indrumar_asamblare_stud.pdf</a> (Size: 457.43 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Suport laborator<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="http://asm.natea.ro/images/attachtypes/pdf.png" title="Adobe Acrobat PDF" border="0" alt=".pdf" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1" target="_blank" title="">Indrumar_asamblare_stud.pdf</a> (Size: 457.43 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>