💻Assembler
Indice
IF
Variables | IF A < B THEN | IF A <= B THEN | IF A = B THEN |
```Assembly
ORG 1000H
A DB 4
B DB 8
C DB ?
C:=A
else
C:=B
```
|
```Assembly
org 2000h
MOV AL, A
MOV BL, B
MOV CL, C
CMP AL,BL
JS MENOR
MOV C,BL
JMP TERMINAR
MENOR: MOV C,AL
TERMINAR:HLT
END
```
|
```Assembly
org 2000h
MOV AL, A
MOV BL, B
MOV CL, C
CMP AL,BL
JS MENOR
JZ MENOR
MOV C,BL
JMP TERMINAR
MENOR: MOV C,AL
TERMINAR:HLT
END
```
|
```Assembly
org 2000h
MOV AL, A
MOV BL, B
MOV CL, C
CMP AL,BL
JZ IGUAL
MOV C,BL
JMP TERMINAR
IGUAL: MOV C,AL
TERMINAR:HLT
END
```
|
Potencias
ORG 2000H ;empiezo en la 2000
MOV AX, 1 ;Al registro le pongo 1 en AL
MOV BX, 1000H
CARGA: MOV [BX], AX ; A la direccion 1000H mando 1 que es AX
ADD BX, 2 ; A 1000h le sumo 2h= 1002h
ADD AX, AX ;hago 1 + 1 =2
CMP AX, 200 ; resto Ax - 200
JS CARGA ; Vuelve a carga hasta que Ax-200 sea positivo
HLT
END
;1,2,4,8,16,32,64,128,256
Suma_De_Elementos_En_Una_Tabla
Variables | Programa Principal |
```Assembly
ORG 1000H
TABLA DB 2,4,6,8,10,12,14,16,18,20
FIN DB ?
;Lo empiezo con basura 1010h
TOTAL DB ?
;Tambien tiene basura 1011h
MAX DB 13 ; 1012h
```
|
```Assembly
ORG 2000H
MOV AL, 0 ;Pongo el registro AL en 0
MOV CL, OFFSET FIN-OFFSET TABLA ;Resta ambas direcciones
;100Ah-1000h
;El resultado nos da la cantidad de elementos que tiene tabla
MOV BX, OFFSET TABLA ;Mandamos al registro BX la dir de tabla (1000h)
SUMA: ADD AL, [BX];Sumo a lo que apunta 1000h se lo suma al registo AL
INC BX ;Incremento la posicion de memoria para ir a 1001h
DEC CL ;Decremento el contador de elementos que tengo en la tabla
JNZ SUMA ;Mientras nuestro contador no esta en cero
HLT
END
; El resultado final es 6E (110 en decimal)
```
|
Menores_o_Iguales_de_X_en_una_Tabla
Variables | Programa Principal |
```Assembly
ORG 1000H
TABLA DB 2,4,6,8,10,12,14,16,18,20
FIN DB ?
TOTAL DB ?
MAX DB 13
```
|
```Assembly
ORG 2000H
MOV AL, 0 ;Inicializo el contador de elementos menores iguales
MOV CL, OFFSET FIN-OFFSET TABLA ;Saco los elementos de la tabla
MOV BX, OFFSET TABLA ;Le paso la posicion de tabla (1000h)
MOV DL, MAX ;Inicializo Max que es 13
COMPARA: CMP [BX],DL ;A lo que apunta BX le resto 13
JS MENOR_IGUAL ;Si [BX] - 13 es negativo lo mando a la etiqueta
JZ MENOR_IGUAL ; Si es igual tambien lo mando a la etiqueta
JMP SIGUE ;Si no se cumple ningunas, salto a sigue e incremento en BX
MENOR_IGUAL: INC AL;El contador
SIGUE: INC BX
DEC CL ;Decrenebto hasta que los elementos sean 0
JNZ COMPARA ;Si el contador no llego a 0 vuelvo a comparar
mov TOTAL,AL ;La cantidad de elementos menores iguales los paso a total
HLT
END
```
|
Suma_De_Vectores
Variables | Programa Principal |
```Assembly
; Memoria de Datos
ORG 1000H
TAB1 DW 1, 1, 1, 1, 1, 1
;6 Elementos de 16 bits c/u
TAB2 DW 2, 2, 2, 2, 2, 2
TAB3 DW ?, ?, ?, ?, ?, ?
;Guardo las direcciones para el resultado
Contador DB 6
;Para recorrer la tabla
DIRECCION DW ?
;Es solo para no perder la direccion de TAB3
```
|
```Assembly
ORG 2000H
MOV AX, OFFSET TAB1 ;Guardo la dir de Tab1 en AX
MOV CX, OFFSET TAB2 ;Guardo la dir de Tab2 en CX
MOV DIRECCION, OFFSET TAB3;Guardo la dir de Tab3 en DIRECCION
BUCLE: MOV BX, AX ;Copio AX en BX
MOV DX, [BX] ;Copio el contenido de la direccion BX
MOV BX, CX ;Copio CX en BX
ADD DX, [BX];Sumo TAB1 con TAB2
MOV BX, DIRECCION ;Copio en BX la direccion de TAB3
MOV [BX], DX ;A TAB3 le paso la suma de TAB1 + TAB2
ADD AX, 2 ;Como tengo 2 bytes por numero, avanzo sumando 2
ADD CX, 2 ;x2
ADD DIRECCION, 2 ;x3
DEC Contador; Repito para todos los numeros de la tabla
JNZ BUCLE ;Si el flag Z no es 0, vuelvo a ejecutar
HLT
END
```
|
Subrutinas
Variables | Modulo | Programa Principal |
```Assembly
ORG 1000H
NUM1 DW 3
NUM2 DW 3
RES DW ?
```
|
```Assembly
ORG 3000H
MUL:MOV CX,0
;Por el momento el resultado es 0
LOOP: ADD CX,BX
DEC AX
JNZ LOOP
FIN: RET
```
|
```Assembly
ORG 2000H
;Inicializamos AX y BX
MOV AX,NUM1
MOV BX,NUM2
CALL MUL
MOV RES,CX
HLT
END
```
|
Parametros_Por_Valor
Variables | Modulo | Programa Principal |
```Assembly
ORG 1000H
NUM1 DW 3
NUM2 DW 3
RES DW ?
```
|
```Assembly
ORG 3000H
MUL:MOV CX,0 ;Por el momento el resultado es 0
MOV BX, SP
ADD BX,2 ;Posiciono en NUM2
MOV DX, [BX] ;Tomo NUM2 en DX
ADD BX,2 ;Posiciono en NUM1
MOV AX,[BX];Tomo NUM1 en AX
LOOP: ADD CX,DX
DEC AX
JNZ LOOP
FIN: RET
```
|
```Assembly
ORG 2000H
;Inicializamos AX y BX
MOV AX,NUM1
MOV BX,NUM2
;Apilamos antes de llamar
PUSH AX
PUSH BX
CALL MUL
MOV RES,CX
POP AX
POP BX
HLT
END
```
|
Parametros_Por_Referencia
Variables | Modulo | Programa Principal |
```Assembly
ORG 1000H
NUM1 DW 3
NUM2 DW 3
RES DW ?
```
|
```Assembly
ORG 3000H
MUL:MOV BX, SP
;Tomo Valor de NUM2 en AX
ADD BX,2 ;Posiciono en DIR de NUM2
MOV AX, [BX] ;AX = Dir de NUM2
MOV DX, BX ;Backup de BX
MOV BX, AX ;BX = Dir de NUM2
MOV AX, [BX] ;AX = NUM2
MOV BX, DX ;Recupero el puntero de la pila
;Tomo valor NUM1 en DX
ADD BX, 2
MOV DX, [BX] ;DX = DIR NUM1(1000H)
MOV BX, DX ;BX = DIR NUM1(1000H)
MOV DX, [BX] ;DX = NU1
;MULTIPLICAR
LOOP: ADD CX,DX
DEC AX
JNZ LOOP
FIN: RET
```
|
```Assembly
ORG 2000H
;Inicializamos AX y BX
MOV AX,NUM1
MOV BX,NUM2
;Apilamos antes de llamar
PUSH AX
PUSH BX
CALL MUL
MOV RES,CX
POP AX
POP BX
HLT
END
```
|
SWAP
Variables | Modulo | Programa Principal |
```Assembly
ORG 1000H
NUM1 DW 3
NUM2 DW 2
```
|
```Assembly
ORG 3000H
SWAP: PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX, SP
;Tomar Dir NUM1
ADD BX, 12
MOV AX,[BX]
;Tomar Dir NUM2
SUB BX, 2
MOV CX, [BX]
;Tomar Valor NUM1
MOV BX, AX
MOV AX, [BX]
MOV DX, BX ;GUARDAMOS DIR NUM1
;Tomar Valor NUM2
MOV BX, CX
MOV CX, [BX]
;Insertar Valor de Num1 en Dir Num2
MOV [BX], AX
;Insertar Valor de Num1 en Dir Num2
MOV BX, DX
MOV [BX], CX
POP DX
POP CX
POP BX
POP AX
RET
```
|
```Assembly
ORG 2000H
;Inicializamos AX y BX
MOV AX,OFFSET NUM1
PUSH AX
MOV AX,OFFSET NUM2
PUSH AX
CALL SWAP
HLT
END
```
|
Suma_tabla_par
ORG 1000H
TABLA DB 2,4,6,8,10,12,14,16,18,20
FIN DB ?
MENSAJE DB "PAR "
FIN1 DB ?
MENSAJE2 DB "IMPAR"
FIN2 DB ?
ORG 2000H
MOV DL, 0 ;Pongo el registro AL en 0
MOV CL, OFFSET FIN-OFFSET TABLA ;Resta ambas direcciones
MOV BX, OFFSET TABLA
SUMA: ADD DL, [BX]
INC BX
DEC CL
JNZ SUMA
AND DL, 1H
JZ PAR
MOV BX, OFFSET MENSAJE2
MOV AL, OFFSET FIN2 - OFFSET MENSAJE2
INT 7
JMP TERMINA
PAR: MOV BX, OFFSET MENSAJE
MOV AL, OFFSET FIN1 - OFFSET MENSAJE
INT 7
TERMINA: INT 0
END
; El resultado final es 6E (110 en decimal)