Member 13639308 Ответов: 1

Проект калькулятор на ассемблере 8086 - помочь


напишите программу в 8086 году с этими требованиями:
1. введите 2 номера от пользователя (нет необходимости проверять целостность ввода)
2. вычитание и сложение действий между 2 числами
3. Разделите действие между двумя числами
4. Действие мультипликации между 2 числами
5. выведите результат на экран в десятичном, двоичном или шестнадцатеричном виде в зависимости от выбора
как это работает: программа сначала получит нажатие клавиши и будет действовать в соответствии с этим выбором
'0' - ввод 2 чисел
'1' - добавить действие
'2' - Действие вычитания
'3' - умножение
'4' - деление
'5' - Печать
__________________

D - печать в десятичной системе счисления
H - печать в шестнадцатеричном формате
B - печать в двоичном формате
'0' - выход из программы


Я застрял на создании этой программы... Кто-нибудь может помочь? это те коды, которые я делал до сих пор, но застрял на том, как прогрессировать

; multi-segment executable file template.

data segment
    ; add your data here!
      
    NUM DW  1254
    STR DB  16   DUP (20H),0AH,0DH,'$'  
    D   DW  10  
    O   DW  8  
    B   DW  2  
    H   DW  16
     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   
      CALL PRINT_HEX  
      CALL PRINT_DEC  
      CALL PRINT_OCT
      CALL PRINT_BIN  
      CALL SOF 
   
;==========================
PRINT_DEC PROC
     MOV    BX , 15  
     MOV    AX , NUM  
L1:  MOV    DX , 0
     DIV    D  
     MOV    STR[BX] , 20H
     ADD    STR[BX] , DL 
     ADD    STR[BX] , 10H
     DEC    BX   
     CMP    AX , 0
     JNZ    L1
     LEA    DX , STR
     MOV    AH , 9
     INT 21H  
ret
PRINT_DEC ENDP       
;==========================
PRINT_HEX PROC
 MOV    BX , 15  
     MOV    AX , NUM  
L3:  MOV    DX , 0 
     MOV    STR[BX] , 20H
     DIV    H  
     CMP    DL , 9
     JLE    L11
     ADD   STR[BX] , 7 
L11: ADD    STR[BX] , DL 
     ADD    STR[BX] , 10H
     DEC    BX   
     CMP    AX , 0
     JNZ    L3
     LEA    DX , STR
     MOV    AH , 9
     INT 21H         
    
ret
PRINT_HEX ENDP       
;==========================
PRINT_BIN PROC
      MOV    BX , 15  
     MOV    AX , NUM  
L2:  MOV    DX , 0
     DIV    B  
     MOV    STR[BX] , 20H
     ADD    STR[BX] , DL 
     ADD    STR[BX] , 10H
     DEC    BX   
     CMP    AX , 0
     JNZ    L2
     LEA    DX , STR
     MOV    AH , 9
     INT 21H     
    
ret
PRINT_BIN ENDP       
;=============================   
PRINT_OCT PROC
     MOV    BX , 15  
     MOV    AX , NUM  
L8:  MOV    DX , 0
     DIV    O   
     MOV    STR[BX] , 20H
     ADD    STR[BX] , DL   
     ADD    STR[BX] , 10H
     DEC    BX   
     CMP    AX , 0
     JNZ    L8
     LEA    DX , STR
     MOV    AH , 9
     INT 21H   
    
ret
PRINT_OCT ENDP       
;=============================   
SOF:
    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.


name Calc
data segment
ETR	DB	0AH,0DH,'$'
NUM1	DB	0
NUM2	DB	0
RESULT	DB        5 DUP ('0'),'$'
TEMP	DB	10

data ends

sseg  segment stack
sseg  ends

code segment
	assume cs:code, ds:data, ss:sseg
start:
	mov ax ,data
	mov ds, ax
	CALL 	GET_NUMBER
	MOV	NUM1 , CL
		
	CALL 	GET_NUMBER
	MOV	NUM2 , CL	
	MOV	AL , NUM1
	ADD	AL , NUM2
	CALL 	PRINT_DEC
	JMP       SOOF
	
;---------------------------	
GET_NUMBER :
	MOV	DX , 0
	MOV	CL , 0
L1:	MOV	AH , 1
	INT	21H
	CMP	AL , 0DH
	JE	END_INPUT
	AND	AL , 0FH
	MOV	CH , AL
	MOV	AL , CL
	MUL	TEMP
	ADD	AL , CH
	MOV	CL , AL
	JMP	L1
END_INPUT: 
RET	
;-----------------------
PRINT_DEC:

	MOV	SI , 4
L2:	MOV	AH , 0
	CMP	AL , 0
	JE	END_PRNDC
	DIV	TEMP
	ADD	RESULT[SI] , AH
	DEC	SI
	JMP	L2
END_PRNDC :

	LEA	DX , ETR
	 MOV	AH , 9
	 INT	21H

	LEA	DX , RESULT
	 MOV	AH , 9
	 INT	21H
	 
RET
;-----------------------


Что я уже пробовал:

я попытался посмотреть в интернете, как получить ввод от пользователя и сделать это меню мне нужно, но я не могу понять это.. бесконечные часы на этом крошечном проекте и теперь застрял с разочарованием..