<?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 - Laborator 5]]></title>
		<link>http://asm.natea.ro/</link>
		<description><![CDATA[Asamblare - http://asm.natea.ro]]></description>
		<pubDate>Thu, 29 Oct 2026 04:57:30 +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>
	</channel>
</rss>