PROBLEMA ENSAMBLADOR 8086

Los temas técnicos que no se encuadran en los foros disponibles.
Cerrado
benedyt

PROBLEMA ENSAMBLADOR 8086

Mensaje por benedyt » 01 Feb 2011, 15:35

Desarrollar un programa en ensamblador del 8086 en entorno MS-DOS que muestre en pantalla un
mensaje en el que se solicite una cadena binaria de 8 dígitos. A continuación, el programa se encargará
de calcular el valor equivalente de dicha representación binaria según los siguientes sistemas de
representación:
- Binario natural sin signo.
- Binario natural con signo.
- Complemento a 1.
- Complemento a 2.
- Decimal Codificado en Binario BCD.
- Hexadecimal.
ALGUNA AYUDA, POR FAVOR!!

ESTO ES LO QUE TENGO ECHO PARA PASAR DE BINARIO A DECIMAL, HABER QUE TAL:

Código: Seleccionar todo

.MODEL small

.stack 100h

.DATA

  cadleer db 9
  long db ?
  cadescr db 9 DUP (?),'$'
  msj db 'Introduzca valor binario ... $'
  msj2 db 'Valor en decimal ... $'

.CODE

; ------------------ MACROS -------------

  posicionar MACRO fila,colum    ; posiciona el cursor en fila, colum

   PUSH AX
   PUSH BX
   PUSH DX

   mov ah,2 ;código de función
	mov bh,0 ;página de video
	mov dh,fila ;fila
	mov dl,colum ;columna
	int 10h

   POP DX
   POP BX
   POP AX


  ENDM

  borrar MACRO                   ; macro borrar pantalla

   ;borrar pantalla
   PUSH AX
   PUSH BX
   PUSH CX
   PUSH DX
	mov ah,6 ;código de la función
	mov al,0 ;borrar pantalla
	mov bh,07h ;atributo para borrado
	mov cx,0 ;esquina superior izquierda (0,0)
	mov dx, 24*256 +79 ;esquina inferior derecha (24,79)
	int 10h
   POP DX
   POP CX
   POP BX
   POP AX

   ENDM

  leer MACRO FRASE               ; lee frase del teclado

    PUSH AX
    PUSH DX
    ; leer cadena
    MOV DX,OFFSET FRASE
    MOV AH,0Ah
    INT 21h
    POP DX
    POP AX

  ENDM

  escribir MACRO FRASE           ; muestra frase por pantalla

    PUSH AX
    PUSH DX
    ; escribir cadena
    MOV DX,OFFSET FRASE
    MOV AH,9
    INT 21h
    POP DX
    POP AX

  ENDM

  escribe_car MACRO char

    ; metemos en la pila
    PUSH AX
    PUSH DX
    ; escribir cadena
    MOV AH,6
    MOV DL,char
    ADD DL,48         ; sumamos para el codigo ASCII
    INT 21h
    ; recuperamos pila
    POP DX
    POP AX

  ENDM

; -------- PROGRAMA PRINCIPAL ----------

  ; iniciando...
  MOV AX,@DATA
  MOV DS,AX

  ; cuerpo
  borrar
  posicionar 20,20
  escribir msj

  leer cadleer

  ; lo metemos en la pila
  ; para dar la vuelta a los datos

  MOV SI,0
  BUCLE:
    MOV AL, cadescr[SI]
    MOV AH,0
    PUSH AX
    ADD SI,1
    MOV BL,long
    MOV BH,0
    CMP SI,BX
    JAE FINBUCLE               ; si SI > long sale del bucle
    JMP BUCLE

  FINBUCLE:

  ; recogemos los datos de la pila
  ; y vamos calculando

  ; en DL tendremos el resultado calculado
  MOV DL,0           ; lo ponemos a 0

  ; recogemos el primer digito
  POP CX
  CMP CL,48       ; lo comparamos con '0' -> 48
  JE CONT
  MOV DL,1

  CONT:          ; calculamos demas digitos

  MOV SI,1
  BUCL2:
    MOV BL,long
    MOV BH,0
    CMP SI,BX
    JAE FINBUCL2               ; si SI <= long sale del bucle

    POP CX
    CMP CL,48        ; comparamos si el digito es '0' -> 48
    JE CONTINUA     ; si es 0 saltamos todo.

    ; si no es 0 suponemos que es 1, aunque sea cualquier digito
    MOV DI,0        ; iniciamos el indice
    MOV AL,1
    POTENCIA:       ; calculamos potencia en AL
      CMP DI,SI
      JAE FINPOT
      MOV BL,2
      MUL BL
      INC DI
    JMP POTENCIA

    FINPOT:
      ADD DL,AL                  ; EL RESULTADO LO GUARDAREMOS EN DL

    CONTINUA:

    ADD SI,1
    JMP BUCL2

  FINBUCL2:

  posicionar 21,20
  escribir msj2
  MOV CL,DL
  MOV CH,0
  CALL Visualiza_Numero

  ; cerrando...
  MOV AH,4ch
  INT 21h

  Visualiza_Numero PROC

    MOV CH,CL

    CMP CH,100        ; comprobamos si tiene 3 digitos
    JB DOSDIG

    ; Tres digitos
    MOV AH,0
    MOV AL,CH
    MOV BL,100
    DIV BL
    MOV CX,AX
    escribe_car CL

    DOSDIG:
    CMP CH,10
    JB UNDIG

    ; Dos digitos
    MOV AH,0
    MOV AL,CH
    MOV BL,10
    DIV BL
    MOV CX,AX
    escribe_car CL

    UNDIG:
    escribe_car CH

    RET

  ENDP

END

NJB
Su anfitrion
Su anfitrion
Mensajes: 1114
Registrado: 12 Oct 2003, 16:27
País: Argentina
Ciudad: Capilla del Señor
Ocupación: System Programmer
Contactar:

Re: PROBLEMA ENSAMBLADOR 8086

Mensaje por NJB » 01 Feb 2011, 16:40

Hola

Te equivocaste de foro, este es para mainframes IBM y por supuesto assembler de plataforma z

Hace tiempo y alla lejos yo y supongo que muchos otros foreros hemos programado en assembler de 8086 y otros de la epoca, pero insisto que no es el foro correcto.

Busca un foro de PC y ahi quizás pueda ser respondida tu duda.

Te mando un cordial saludo.
Norberto Bocalandro

Cerrado