;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; ;;;; ;;;; Fichero generado ;;;; ;;;; por ;;;; ;;;; BACK_END ;;;; ;;;; ;;;; ;;;; (C) Soft & Magic Ltd. ;;;; ;;;; ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CR equ 13 LF equ 10 PILA SEGMENT STACK dw 128 dup(?) PILA ENDS DATOS SEGMENT RETURN db CR,LF,"$" SIGNO db 0 BUFFER db 9 dup(7) DIGITOS db 7 dup(0) MEN_ERROR db "Lo siento, entrada incorrecta.",CR,LF db "Ejecucion interrumpida.$" MEN_ERROR_2 db "Numero con valor absoluto mayor que 32767.",CR,LF db "Ejecucion interrumpida.$" DISPLAY dw 20 dup(0) long dw 0 ind dw 0 c dw 0 a1 dw 10 dup(0) a2 dw 10 dup(0) DATOS ENDS CODIGO SEGMENT assume CS:CODIGO, DS:DATOS, SS:PILA ; PROCEDURE invertir invertir proc push BP mov BP, SP sub SP, 6 push display[0] mov display[0], BP push AX push BX push CX push DX mov AX, 0 mov [BP-2], AX E10: mov AX, [BP-2] cmp AX, long jng S10 jmp E20 S10: mov AX, long sub AX, [BP-2] mov [BP-4], AX mov SI, [BP-2] sal SI, 1 add SI, +8 mov AX, [BP+SI] mov [BP-6], AX mov AX, [BP-6] mov SI, [BP-4] sal SI, 1 mov ES, [BP+6] mov DI, [BP+4] add DI, SI mov ES:[DI], AX mov AX, 0 mov SI, [BP-2] sal SI, 1 add SI, +8 mov [BP+SI], AX mov AX, [BP-2] add AX, 1 mov [BP-2], AX jmp E10 E20: pop DX pop CX pop BX pop AX pop display[0] mov SP, BP pop BP ret 24 invertir endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; PROGRAMA PRINCIPAL ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; prueba1 proc far push DS xor AX, AX push AX mov AX, DATOS mov DS, AX mov BP, SP sub SP, 4 mov AX, 9 mov long, AX mov AX, 0 mov ind, AX E30: mov AX, ind cmp AX, long jng S20 jmp E40 S20: call LEER mov c, CX mov AX, c mov SI, ind sal SI, 1 mov a1[SI], AX mov AX, ind add AX, 1 mov ind, AX jmp E30 E40: push DS pop ES mov DI, offset a1 mov CX, 10 add DI, 18 S30: push ES:[DI] sub DI, 2 loop S30 push DS mov AX, offset a2 push AX call invertir mov AX, 0 mov ind, AX E50: mov AX, ind cmp AX, long jng S40 jmp E60 S40: mov SI, ind sal SI, 1 mov AX, a1[SI] mov [BP-2], AX mov SI, ind sal SI, 1 mov AX, a2[SI] mov [BP-4], AX mov CX, [BP-2] call ESCRIBIR mov CX, [BP-4] call ESCRIBIR call NUEVA_LINEA mov AX, ind add AX, 1 mov ind, AX jmp E50 E60: mov SP, BP ret prueba1 endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; PROCEDURE LEER ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; LEER PROC PUSH AX PUSH BX PUSH DX LEA DX,BUFFER MOV AH,0AH INT 21H CALL NUEVA_LINEA MOV SIGNO,0 XOR CX,CX LEA SI,BUFFER MOV CL, BYTE PTR [SI+1] CMP CX,0 JE ERR_LEER XOR BX,BX XOR DI,DI XOR AX,AX CMP BYTE PTR [SI+2],45 JNE POSITIVO CMP BYTE PTR [SI+1],1 JE ERR_LEER MOV SIGNO,1 MOV BYTE PTR [SI+2],48 JMP BUCLE POSITIVO: CMP BYTE PTR [SI+1],5 JG ERR_LEER BUCLE: LEA SI,BUFFER+2 BUCLE2: MOV BL, BYTE PTR [SI] SUB BL, 48 CMP BL,0 JL ERR_LEER CMP BL,9 JG ERR_LEER MOV DI,10 IMUL DI JO ERR_OVF XOR BH,BH ADD AX,BX JO ERR_OVF INC SI LOOP BUCLE2 MOV CX,AX CMP SIGNO,0 JE ERA_POS NEG CX ERA_POS: POP DX POP BX POP AX RET ERR_LEER: LEA DX, MEN_ERROR MOV AH,9 INT 21H MOV AH,4CH INT 21H ERR_OVF: LEA DX, MEN_ERROR_2 MOV AH,9 INT 21H MOV AH,4CH INT 21H LEER ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; PROCEDURE ESCRIBIR ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ESCRIBIR PROC PUSH AX PUSH BX PUSH DX MOV SIGNO,32 ; ASCII 32=" " CMP CX,0 JGE NO_SIGNO MOV SIGNO,45 ; ASCII 45="-" NEG CX NO_SIGNO: CMP CX,7FFFH JG ERR_ESCR MOV AX,CX MOV CX,SP MOV [DIGITOS]+6,36 ; ASCII 36="$" MOV BX,10 LEA SI,DIGITOS+6 REP: XOR DX,DX DIV BX ADD DX,48 DEC SI MOV [SI],DL CMP AX,0 JNE REP MOV AL,[SIGNO] DEC SI MOV [SI],AL MOV DX,SI MOV AH,9 INT 21H POP DX POP BX POP AX RET ERR_ESCR: LEA DX,MEN_ERROR_2 MOV AH,9 INT 21H MOV AH,4CH INT 21H ESCRIBIR ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; PROCEDURE NUEVA_LINEA ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; NUEVA_LINEA PROC PUSH AX PUSH DX LEA DX,RETURN MOV AH,9 INT 21H POP DX POP AX RET NUEVA_LINEA ENDP CODIGO ENDS END prueba1