viernes, 27 de junio de 2014

ejemplos de lenguaje ensamblador

Programa que suma dos números enteros de 8 bits sin signo situados en memoria y almacena el resultado en memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
   
Num1 DB 20h
Num2 DB 30h
Res  DB ?
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov  AL,Num1
    add  AL,Num2
    mov Res,AL
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.



2.     Programa que suma dos números enteros de 16 bits sin signo situados en memoria y almacena el resultado en memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
    Num1 DW 50h
    Num2 DW 20h
    Res  DW  ?
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov Ax,Num1
    add Ax,Num2
    mov Res,Ax
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.






3.     Programa que suma dos números enteros de 32 bits sin signo situados en memoria y almacena el resultado en memoria. El programa se hará con las dos variantes siguientes:

Declarando cada dato como una tabla de dos palabras, por ejemplo, Sumando1 DW 1235h,4565h y acceder a cada palabra utilizando la dirección más un índice. Por ejemplo, Sumando1 para la primera palabra del dato y Sumando1+2 para la segunda.

; multi-segment executable file template.

data segment
    ; add your data here!
   
    sumando1 DW 1235h,4565h
    Res DW ?
   
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov AX,sumando1
    add AX,sumando1+2
    mov Res,AX
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends
end start ; set entry point and stop the assembler.


3. Programa que suma dos números enteros de 32 bits sin signo situados en memoria y almacena el resultado en memoria. El programa se hará con las dos variantes siguientes:
·         Declarando cada dato como doble palabra, por ejemplo, Sumando1 DD 45651235h y acceder a cada palabra con la directiva WORD PTR. Por ejemplo, mov ax,WORD
PTR Sumando1 cargaría en el registro AX la palabra de menor peso de Sumando1.

; multi-segment executable file template.

data segment
    ; add your data here!
    sumando1 DD 45651235h
    sumando2 DD 45651235h
    suma1   DW ?
    suma2   DW ?
    Res     DW ?
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here 
    mov ax,WORD PTR sumando1
    mov bx,WORD PTR sumando2
    add ax,bx
    mov suma1,ax
   
    
    mov ax,WORD PTR sumando1+2
    mov bx,WORD PTR sumando2+2
    add ax,bx
    mov suma2,ax
   
    mov ax,suma2
    mov bx,suma1
   
    mov Res WORD PTR+2,bx
    mov Res WORD PTR, ax
   
    
   
   
    ;mov Res,ax
   
   
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.


4.     Programa que suma dos números enteros de 64 bits sin signo situados en memoria y almacena  el resultado en memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
    num1 dw 2425h,2586h,4598h,5649h
    num2 dw 5263h,8463h,1234h,3698h
    res dw ?, ?, ?, ?
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov ax,num1
    add ax,num2
    mov res,ax
    mov ax,num1+2
    add ax,num2+2
    mov res+2,ax
    mov ax,num1+4
    add ax,num2+4
    mov res+4,ax
    mov ax,num1+6
    add ax,num2+6
    mov res+6,ax
   
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.

5.     Programa que resta dos números de 16 bits situados en memoria y almacena el resultado en memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
    Num1 DW 50h
    Num2 DW 20h
    Res  DW  ?
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov Ax,Num1
    sub Ax,Num2
    mov Res,Ax
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.

6.     Programa que resta dos números enteros de 64 bits sin signo situados en memoria y almacena el resultado en memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
    num1 dw 2425h,2586h,4598h,5649h
    num2 dw 5263h,8463h,1234h,3698h
    res dw ?, ?, ?, ?
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov ax,num1
    sub ax,num2
    mov res,ax
    mov ax,num1+2
    sub ax,num2+2
    mov res+2,ax
    mov ax,num1+4
    sub ax,num2+4
    mov res+4,ax
    mov ax,num1+6
    sub ax,num2+6
    mov res+6,ax
   
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.


7.     Programa que multiplica un número de 8 bits sin signo por otro número del mismo tipo, almacenados ambos en la memoria. El resultado se almacena en la memoria.


; multi-segment executable file template.

data segment
    ; add your data here!
    Num1 db 12h
    Num2 db 34h
    var1 db  ?
    Res  dw  ?
   
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
   
    mov al,Num1
    mov var1,al
    mov al,Num2
    MUL var1
    mov Res,ax
           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.


8.     Programa que multiplica un número de 16 bits sin signo por otro número del mismo tipo, almacenados ambos en la memoria. El resultado se almacena en la memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
    dato1 dw 1234d
    dato2 dw 1234d
    res   dd  ?
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here 
    MOV BX, dato1     
    MOV CX, dato2
    MOV AX, CX;
    MUL BX
    ;el resultado se encuentra en dx-ax
    mov res word ptr+2,ax
    mov res word ptr,dx

           
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.


9.     Programa que divide un número de 8 bits sin signo por otro número del mismo tipo,
almacenados ambos en la memoria. El cociente y el resto se almacenan por separado en dos posiciones de memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
    dato1 db 20h
    dato2 db 03h
    cociente db  ?
    residuo    db  ?
   
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov al,dato1; Se asigna valor al dividendo
    mov ah,0; Se extiende con ceros
    div dato2;Se realiza la division.
    mov cl,al; Se almacena el cociente en CX
    mov dh,ah; Se almacena el residuo en DX
    mov cociente,cl
    mov residuo,dh
   
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.


10.                       Programa que divide un número de 16 bits sin signo por otro número del mismo tipo,
almacenados ambos en la memoria. El cociente y el resto se almacenan por separado en dos posiciones de memoria.

; multi-segment executable file template.

data segment
    ; add your data here!
    dato1 dw 4567d
    dato2 dw 1234d
    cociente dw  ?
    residuo  dw  ?
   
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
    mov ax,dato1
    mov dx,0
    mov cx,dato2
    div cx
    mov cociente,ax
    mov residuo,dx
   
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.