3814077-ejercicosassembler.pdf

6
; suma los 10 primeros numeros enteros ; el resultado queda almacenado en AX .model small .code ini: mov cx,10 ; asigna a CX la cantidad de enteros a sumar mov ax,0 ; inicializa la suma (AX) con 0 mov bx,1 ; BX <-- 1 , es el 1er entero a sumar otra_vez: add ax,bx ; suma a AX el N_esimo entero inc bx ; pasar al siguiente entero loop otra_vez ; decrementa CX, sino es 0 vuelve a iterar mov ah,4ch ; salir int 21h end ini ; calcula el factorial de NUM y lo almacena en AX ; AX = NUM*(NUM-1)*(NUM-2)... .model small .const NUM=5 ; factorial de 5 .code ini: mov cx,NUM ; establece # de iteraciones mov ax,1 ; inicializa factorial a 1 a01: mul cx ; AX = AX * CX loop a01 ; CX = CX - 1 mov ah,4ch int 21h end ini ; halla el MCD mediante el algoritmo de Euclides ; AX contiene al MCD .model small .code ini: mov ax,42 ; AX es el numero mayor mov bx,18 ; BX es el numero menor a01: xor dx,dx ; hace DX=0 div bx ; DX_AX/BX mov ax,bx ; divisor pasa a ser dividendo mov bx,dx ; residuo pasa a ser divisor or dx,dx ; si residuo es 0 jne a01 ; vuelve a iterar ; sino sale mov ah,4Ch int 21h end ini ; halla la suma de los divisores de un numero dividiendolo ; entre 1, 2, 3, ... cada vez que el residuo es 0, lo acumula ; en el registro DI .model small .code ini: mov si, 18 ; SI contiene el nro a analizar mov di,0 ; se inicializa la suma (DI) con 0 mov bx, 1 ; BX divisor inicial (1) a01: mov ax,si ; Dividendo (AX) <-- SI div bl ; AX/BL cmp ah,0 ; comparar residuo con 0 jne a02 ; saltar a a02 si no es igual add di,bx ; si residuo es 0, acumular en DI el divisor a02: inc bl ; pasar al siguiente valor (divisor) cmp al,0 ; si AL=0 ==> ya no hay mas divisores jne a01 mov ah,4ch int 21h end ini ; halla AX^BX, resultado en AX .model small .code ini: mov ax,3 ; establece la base mov bx,7 ; establece la potencia mov cx,bx ; establece # de iteraciones (7) mov bx,ax ; BX <-- 3, asigna a BX la base (3) mov ax,1 ; AX <-- 1, inicializa la potencia con 1 a01: mul bx ; AX <-- AX * BX (multiplica CX veces BX) loop a01 mov ah,4ch int 21h end ini ; halla el N_esimo termino de la serie de fibonacci ; AX contiene el resultado .model small .code ini: mov cx,8 ; CX es la cantidad de terminos a determinar mov ax,1 ; AX es el termino -1 mov bx,0 ; BX es el termino 0, T(1)=T(-1)+T(0), T(2)=T(0)+T(1)... a01: mov dx,ax ; DX <-- AX add dx,bx ; DX <-- DX + BX = AX + BX mov ax,bx ; AX pasa a ser el siguiente termino mov bx,dx ; BX pasa a ser el ultimo termino loop a01 ; mientras CX>0 vuelve a iterar mov ah,4ch int 21h end ini ; halla la suma de los digitos del numero AX ; divide sucesivamente AX entre 10 y acumula los residuos (digitos) ; en SI, resultado en SI .model small .code ini: mov ax,1234 ; AX <-- # a procesar mov bx,10 ; BX <-- 10 mov si,0 ; inicializa suma(SI) con 0 a01: xor dx,dx ; DX <-- 0 div bx ; DX_AX/BX add si,dx ; suma a SI el residuo de la division (digito) or ax,ax ; comprueba si dividendo es 0 jnz a01 ; regresa a a01 sino es 0 mov ah,4ch int 21h end ini ; halla el entero mas cercano a la raiz ; cuadrada de un entero .model small .data x dw 30 a dw 20 .code ini: mov ax,@data mov ds,ax 1

Transcript of 3814077-ejercicosassembler.pdf

Page 1: 3814077-ejercicosassembler.pdf

; suma los 10 primeros numeros enteros; el resultado queda almacenado en AX.model small.code ini: mov cx,10 ; asigna a CX la cantidad de enteros a sumar mov ax,0 ; inicializa la suma (AX) con 0 mov bx,1 ; BX <-- 1 , es el 1er entero a sumar otra_vez: add ax,bx ; suma a AX el N_esimo entero inc bx ; pasar al siguiente entero loop otra_vez ; decrementa CX, sino es 0 vuelve a iterar mov ah,4ch ; salir int 21hend ini

; calcula el factorial de NUM y lo almacena en AX; AX = NUM*(NUM-1)*(NUM-2)....model small .const NUM=5 ; factorial de 5.code ini: mov cx,NUM ; establece # de iteraciones mov ax,1 ; inicializa factorial a 1 a01: mul cx ; AX = AX * CX loop a01 ; CX = CX - 1

mov ah,4ch int 21h end ini

; halla el MCD mediante el algoritmo de Euclides; AX contiene al MCD.model small.code ini: mov ax,42 ; AX es el numero mayor mov bx,18 ; BX es el numero menor a01: xor dx,dx ; hace DX=0 div bx ; DX_AX/BX mov ax,bx ; divisor pasa a ser dividendo mov bx,dx ; residuo pasa a ser divisor or dx,dx ; si residuo es 0 jne a01 ; vuelve a iterar ; sino sale mov ah,4Ch int 21h end ini

; halla la suma de los divisores de un numero dividiendolo; entre 1, 2, 3, ... cada vez que el residuo es 0, lo acumula; en el registro DI.model small.code ini: mov si, 18 ; SI contiene el nro a analizar mov di,0 ; se inicializa la suma (DI) con 0 mov bx, 1 ; BX divisor inicial (1) a01: mov ax,si ; Dividendo (AX) <-- SI div bl ; AX/BL cmp ah,0 ; comparar residuo con 0 jne a02 ; saltar a a02 si no es igual add di,bx ; si residuo es 0, acumular en DI el divisor a02: inc bl ; pasar al siguiente valor (divisor) cmp al,0 ; si AL=0 ==> ya no hay mas divisores jne a01

mov ah,4ch int 21h end ini

; halla AX^BX, resultado en AX.model small.code ini: mov ax,3 ; establece la base mov bx,7 ; establece la potencia

mov cx,bx ; establece # de iteraciones (7) mov bx,ax ; BX <-- 3, asigna a BX la base (3) mov ax,1 ; AX <-- 1, inicializa la potencia con 1 a01: mul bx ; AX <-- AX * BX (multiplica CX veces BX) loop a01

mov ah,4ch int 21h end ini

; halla el N_esimo termino de la serie de fibonacci; AX contiene el resultado.model small.code ini: mov cx,8 ; CX es la cantidad de terminos a determinar mov ax,1 ; AX es el termino -1 mov bx,0 ; BX es el termino 0, T(1)=T(-1)+T(0), T(2)=T(0)+T(1)... a01: mov dx,ax ; DX <-- AX add dx,bx ; DX <-- DX + BX = AX + BX mov ax,bx ; AX pasa a ser el siguiente termino mov bx,dx ; BX pasa a ser el ultimo termino loop a01 ; mientras CX>0 vuelve a iterar

mov ah,4ch int 21h end ini

; halla la suma de los digitos del numero AX; divide sucesivamente AX entre 10 y acumula los residuos (digitos); en SI, resultado en SI.model small.code ini: mov ax,1234 ; AX <-- # a procesar mov bx,10 ; BX <-- 10 mov si,0 ; inicializa suma(SI) con 0 a01: xor dx,dx ; DX <-- 0 div bx ; DX_AX/BX add si,dx ; suma a SI el residuo de la division (digito) or ax,ax ; comprueba si dividendo es 0 jnz a01 ; regresa a a01 sino es 0

mov ah,4ch int 21h end ini

; halla el entero mas cercano a la raiz; cuadrada de un entero.model small.data x dw 30 a dw 20.code ini: mov ax,@data mov ds,ax

1

Page 2: 3814077-ejercicosassembler.pdf

a01: xor dx,dx mov ax,x mov bx,a div bx add ax,a shr ax,1 cmp ax,a je salir mov a,ax jmp a01 salir: ; AX contiene la raiz mov ah,4ch int 21h end ini

; Imprime el entero AX en el sistema de; numeracion base 5.model small.code extrn impchr:near ini: mov ax,1234 ; establece el numero a imprimir mov bx,5 ; establece la base xor cx,cx ; inicializa el contador de digitos sge: xor dx,dx ; DX <-- 0 div bx ; DX_AX/BX push dx ; apilar residuo inc cx ; incrementar contador de digitos cmp ax,0 ; verificar si aun se puede descomponer el # jne sge ; regresa a descompner el # imp: pop ax ; desapila digito en AX (AL contiene el digito) add al,'0' ; se convierte digito a caracter ( 7 --> '7' call impchr ; se imprime caracter AL loop imp ; decrementa CX, sino es 0 regresa imp mov ah,4ch int 21h end ini

ARREGLOS

; halla el mayor y menor elemento de un arreglo ; de 13 elementos, las variables max y min contienen ; los resultados.model small.data notas db 10,12,7,16,5,19,12,8,10,8,9,10,11 max db ? min db ?.code ini: mov ax,@data mov ds,ax ; DS apunta al segmento de datos mov si,offset notas ; SI apunta al 1er elemento del arreglo notas mov al,[si] ; tomamos el 1er elemento en AL y lo asignamos mov max,al ; a max y min (variables) debido a que no esta mov min,al ; permitido MOV max,[SI] (memoria a memoria) mov cx,13 ; CX <-- cantidad de elementos del arreglo a01: lodsb ; cargamos elemento apuntado por SI cmp al,max ; AL > max ? jbe a02 ; salta a a02 si no lo es mov max,al ; si AL > max ===> max <-- AL a02:

cmp al,min ; AL < min ? jae a03 ; salta a a03 si no lo es mov min,al ; si AL < min ===> min <-- AL a03: loop a01

mov ah,4ch int 21h end ini

; halla el mayor y menor elemento de un arreglo; de 13 elementos, las variables max y min contienen; los resultados.model small.data notas db 10,12,7,16,5,19,12,8,10,8,9,10,11 max db ? min db ?.code ini: mov ax,@data mov ds,ax ; DS apunta al segmento de datos mov si,offset notas ; SI apunta al 1er elemento del arreglo notas mov al,[si] ; tomamos el 1er elemento en AL y lo asignamos mov max,al ; a max y min (variables) debido a que no esta mov min,al ; permitido MOV max,[SI] (memoria a memoria) mov cx,13 ; CX <-- cantidad de elementos del arreglo a01: lodsb ; cargamos elemento apuntado por SI cmp al,max ; AL > max ? jbe a02 ; salta a a02 si no lo es mov max,al ; si AL > max ===> max <-- AL a02: cmp al,min ; AL < min ? jae a03 ; salta a a03 si no lo es mov min,al ; si AL < min ===> min <-- AL a03: loop a01

mov ah,4ch int 21h end ini

; halla la cantidad de veces que apaprece la "a" en una ; cadena asciiz, CX contiene resultado.model small.data cadena db "bienvenidos al maravilloso mundo del ensamblador",0.code ini: mov ax,@data mov ds,ax ; DS apunta al segmento de datos mov si,offset cadena ; SI apunta al 1er elemento de la cadena mov cx,0 ; CX contador a01: lodsb ; carga caracter de la cadena apuntada por SI or al,al ; es fin de cadena? (caracter nulo) je fin ; si es el caracter nulo, salir cmp al,'a' ; es el caracter 'a'? jne a01 ; sino es, regresa a a01 inc cx ; incrementa contador jmp a01

fin:

2

Page 3: 3814077-ejercicosassembler.pdf

mov ah,4ch int 21h end ini

; Determina si una palabra es o no un palindromo.model small.data cad db 'anilina',0 sies db 'Si es un palindromo',0 noes db 'No es un palindromo',0.code extrn impcad:near ini: mov ax,@data mov ds,ax mov bl,14h ; establece color de impresion

mov di,offset cad ; DI apunta al 1er chr de cad mov si,di ; SI apunta al 1er chr de cad a01: cmp byte ptr [di],0 ; [DI] apunta al chr nulo? je a02 ; salir del bucle inc di ; sino pasa al sgte chr jmp a01 ; vuelve a iterar a02: dec di ; retrocede un chr cmp si,di ; compara los punteros jae a03 ; si SI>=DI, salta a a03 lodsb ; sino, carga en AL el chr apuntado por DS:SI (SI incremnta) cmp al,[di] ; compara los caracteres je a02 ; si son iguales regresa a a02 mov si,offset noes ; sino call impcad ; imprime "no es palindromo" jmp salir ; salir a03: mov si,offset sies ; imprime "si es palindromo" call impcad salir: mov ah,4ch int 21h end ini

El contenido de la localidad 0200 tiene un dato de 8 bits. Realizar un programa que coloque en la localidad de memoria 0201 el nibble (4bits) más significativo, tomando en cuenta que el nibble menos significativodebe ser 0.

MOV AL, [200] ;mueve el contenido de la localidad 200 a ALAND AL, F0 ;coloca 1111 0000 en ALMOV [201], AL ;mueve el contenido de AL a la localidad 201MOV AH, 4C ;mueve el contenido de 4C a AHINT 21

Realizar un programa que coloque en la localidad de memoria 202 el número menor de los contenidos en las localidades 200 y 201. Considerenúmeros sin signo

COMPARA: MOV AL, [200]CMP AL, [201]JNB SIIMOV AL, [201]SII: MOV [202], ALMOV AH, 4CINT 21

Sumar 2 números binarios de 24 bits y almacenar el resultado a partir de la localidad de memoria 0206h. Los bits menos significativos de los númerosempiezan en las localidades 0200h y 0203h.

SUMA:MOV AL, [200] ;mover el contenido de la localidad 200 a AL

ADD AL, [203] ;sumar el contenido de la localidad 201 a AL 8 LSBMOV [206], AL ;mover el contenido de AL a la localidad 206MOV AL, [201] ;mover el contenido de la localidad 201 a ALADC AL, [204] ;sumar el contenido de la localidad 204 con AL 2º BYTEMOV [207], AL ;mover el contenido de AL a la localidad 207MOV AL, [202] ;mover el contenido de la localidad 202 a ALADC AL, [205] ;sumar el contenido de la localidad 205 con AL 8 MSBMOV [208], AL ;mover el contenido de AL a la localidad 208RET

Uso del registro CX como contador. Vamos a mover los 8 bits menossignificativos del registro BL al registro BH.Sean los datos iniciales:BX = BH y BL = 43A6La instrucción que usaremos será RLC BX, 1, 8 veces. Para este tipode repeticiones usaremos al registro CX como contadoROTA8: MOV BX, 43A6 ;(1)MOV CX, 08 ;(2)OTRAVEZ: RLC BX, 1 ;(3)LOOP OTRAVEZ ;(4)MOV AH, 4C ;(5)INT 21 ;(6)

Investigar una cadena de caracteres ASCII para determinar el último carácter distinto del blanco. La cadena empieza en la localidad 202 yfinaliza con CR (0Dh) Colocar la dirección del último carácter diferentedel espacio en la localidad 200 y 201.

X: MOV AL, [SI]CMP AL, 0dh ;AL vs ´CR´JE AlmacenaCMP AL, 20h ;AL vs ´SPACE´JE ANTESALMINC SIJMP XANTESALM: DEC SIALMACENA: MOV 200, SIEND

Comparar dos cadenas de caracteres ASCII para determinar cuál sigue a la otra en orden alfabético. La longitud de las cadenas está en la localidad201. Una cadena inicia en la localidad 202 y la otra en la localidad 252. Si la cadena que inicia en la localidad 202 es menor o igual a la otra cadena, borrar la localidad 200, en caso contrario almacenar FF en la localidad 200.

COMPARA: SUB [200], [200] ;asumimos que cadena 1 es menor o igual a cadena 2MOV DI, 0202h ;DI apunta al inicio de la cadena 1MOV CH, 00h ;CX igual a la longitud de las cadenasMOV CL, [0201]R: MOV AL, [DI]CMP AL, [DI+10h] ;apunta a la otra cadenaJNC NOINC DILOOPNZ RENDNO: JB SIIMOV [0200], FFhSII: END

3

Page 4: 3814077-ejercicosassembler.pdf

MODULOS

;Este programa es un simple juego que lo unico que hace es desplazar;por la pantalla un asterisco por medio de las teclas direccion (flechas);el color del sterisco se puede cambiar presionando una Nº entre 1 y 7;Hace uso del modulo VIDEO.ASM (procedimientos limpiar, ir_axy y impchr)

.model small

.const scp equ 27 spc equ ' ' chr equ '*'.data x db 39 y db 13 color db 4 pintar db 0FFh.code extrn limpiar:near extrn ir_axy:near extrn impchr:nearini: mov ax,@data mov ds,ax call limpiar ; limpia pantallaimp: mov dh,y mov dl,x call ir_axy ; posiciona cursor en x,y cmp pintar,0FFh jne otk mov bl,color ; establece el color del caracter mov al,chr call impchr ; imprime asterisco *otk: mov ah,0 int 16h ; espera que se presione una tecla cmp al,'0' ; si tecla es un # entre 0 jb a00 cmp al,'7' ; y 7, establece un color para el * ja a00 and al,0Fh mov color,ala00: cmp al,spc ; es tecla barra espaciadora (activa y desactiva pintado) jne a01 not pintar ; conmutar variable pintar jmp otka01: cmp al,scp ; es tecla escape? je fin ; salta a fin de programa cmp al,0 ; es tecla especial (F1, F2,...->, <-,... jne otk ; si no lo es, lee otro caracter cmp ah,50h ; es flecha abajo? jne a02 inc y ; desplaza hacia abajo una fila cmp y,24 jle imp mov y,0 jmp impa02: cmp ah,4bh ; es flecha izquierda? jne a03 dec x ; desplaza hacia la izquierda un columna cmp x,0 jge imp mov x,79 jmp impa03: cmp ah,4dh ; es flecha derecha?

jne a04 inc x ; desplaza hacia la derecha un columna cmp x,79 jle imp mov x,0 jmp impa04: cmp ah,48h ; es flecha arriba? jne otk dec y ; desplaza hacia arriba una fila cmp y,0 jge a05 mov y,24a05: jmp impfin: mov ah,4ch ; sale a DOS int 21h

end ini

Modulo de salida video.asm.model small.codepublic limpiar; limpia la pantallalimpiar proc push ax push bx push cx push dx mov ax,600h mov bh,7 xor cx,cx mov dx,184fh int 10h xor dx,dx call ir_axy pop dx pop cx pop bx pop ax retlimpiar endp

public ir_axy; ubica el cursor en la fila DH, columna DLir_axy proc push ax push bx mov ah,2 mov bh,0 int 10h pop bx pop ax retir_axy endp

comment * Desactiva el cursor *public descurdescur proc push ax push bx push cx push dx mov ah,3 mov bh,0 int 10h mov cs:cursor,cx mov cx,02929h mov ah,1 int 10h pop dx pop cx pop bx

4

Page 5: 3814077-ejercicosassembler.pdf

pop ax retdescur endp

cursor dw ?

comment * Activa el cursor *public actcuractcur proc push ax push cx mov cx,cs:cursor mov ah,1 int 10h pop cx pop ax retactcur endp

public impnum; imprime el n£mero AX con el color BLimpnum proc push ax push bx push cx push dx push si mov si,10 xor cx,cx sge: xor dx,dx div si push dx inc cx cmp ax,0 jne sge imp: pop ax add al,'0' call impchr loop imp pop si pop dx pop cx pop bx pop ax retimpnum endp

public impchr; imprime el caracter AL con el color BLimpchr proc push ax push bx push cx push dx mov ah,9 mov bh,0 mov cx,1 int 10h mov ah,3 int 10h inc dl call ir_axy pop dx pop cx pop bx pop ax retimpchr endp

public impcad; imprime una cadena ASCIIZ apuntada por DS:SI con el color BLimpcad proc pushf push ax push si

cld g00: lodsb or al,al jz g01 call impchr jmp g00 g01: pop si pop ax popf retimpcad endp end limpiar

teclado.asm modulo de entrada

.model small

.codepublic leechrleechr proc mov ah,0 int 16h retleechr endp

public leecad;lee una cadena desde teclado y la almacena de ES:DIleecad proc push ax push bx push cx push dx push di mov ah,0fh ; obtiene modo de video int 10h ; y pag de visualizacion mov ah,3 ; lee posicion del cursor int 10h a01: mov ah,8 ; lee chr y atrib de la pos int 10h ; actual del cursor mov bl,ah ; guarda en BL el atributo mov ah,0 ; lee caracter desde teclado int 16h cmp al,0 ; tecla especial F1,INSERT,INICIO,etc je a01 cmp al,8 ; tecla BACKSPACE jne a02 dec di dec dl ; pasa a la columna anterior mov ah,2 ; ubica el cursor int 10h mov ax,920h ; borra caracter anterior mov cx,1 ; imprimiendo espacio en blanco int 10h jmp a01 a02: cmp al,13 ; tecla ENTER je a99 cmp al,' ' ; ascii=32 jb a01 cmp al,' ' ; ascii=127� ja a01 stosb mov ah,9 ; imprime caracter leido mov cx,1 int 10h inc dl mov ah,2 ; ubica el cursor en la sgte columna int 10h jmp a01 a99: mov al,0 stosb pop di pop dx pop cx pop bx pop ax retleecad endp

5

Page 6: 3814077-ejercicosassembler.pdf

public leenum;lee una cadena numerica desde teclado y la almacena de ES:DIleenum proc push ax push bx push cx push dx push di mov ah,0fh ; obtiene modo de video int 10h ; y pag de visualizacion mov ah,3 ; lee posicion del cursor int 10h b01: mov ah,8 ; lee chr y atrib de la pos int 10h ; actual del cursor mov bl,ah ; guarda en BL el atributo mov ah,0 ; lee caracter desde teclado int 16h cmp al,0 ; tecla especial F1,INSERT,INICIO,etc je b01 cmp al,8 ; tecla BACKSPACE jne b02 dec di dec dl ; pasa a la columna anterior mov ah,2 ; ubica el cursor int 10h mov ax,920h ; borra caracter anterior mov cx,1 ; imprimiendo espacio en blanco int 10h jmp b01 b02: cmp al,13 ; tecla ENTER je b99 cmp al,'.' ; chr es punto decimal je b03 cmp al,'0' ; chr='0' jb b01 cmp al,'9' ; chr='9' ja b01 b03: stosb mov ah,9 ; imprime caracter leido mov cx,1 int 10h inc dl mov ah,2 ; ubica el cursor en la sgte columna int 10h jmp b01 b99: mov al,0 stosb pop di pop dx pop cx pop bx pop ax retleenum endp

end leechr

modulo para redireccionar vectores de interrupción

.model small

.codepublic obtvec; retorna en ES el segmento y en BX el offset de la rutina; procesadora de la interrupcion ALobtvec proc push ax push si push ds xor ah,ah shl ax,1 shl ax,1

mov si,ax xor ax,ax mov ds,ax les bx,[si] pop ds pop si pop ax retobtvec endp

public estvec; redirecciona el vector de interrupcion AL al segmento DS y; offset DXestvec proc push ax push di push es xor ah,ah shl ax,1 shl ax,1 mov di,ax xor ax,ax mov es,ax mov ax,ds cli mov es:[di],dx mov es:[di+2],ax sti pop es pop di pop ax retestvec endp

end

6