程序集8086中的计算器项目 - 帮助 [英] Calculator project in assembly 8086 - HELP

查看:103
本文介绍了程序集8086中的计算器项目 - 帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据这些要求在8086写一个程序:

1.从用户输入2个数字(无需检查输入的完整性)

2.减法和2个数字之间的ADD动作

3. 2个数字之间的分隔动作

4. 2个数字之间的多重动作

5.打印屏幕上的结果在DECIMAL或BINARY或HEXA中取决于选择

它是如何工作的:程序将首先按下按键并按照该选择行动

'0 ' - 输入2个数字

'1' - 添加动作

'2' - 减法行动

'3' - 乘法

'4' - 分开

'5' - 打印

__________________



D - 打印十进制

H - 以六进制打印

B - 以二进制打印

'0' - 退出程序





我坚持制作这个程序......任何人都可以提供帮助吗?这是我到目前为止所做的代码但却陷入了如何进步的状态



;多段可执行文件模板。 

数据段
;在这里添加您的数据!

NUM DW 1254
STR DB 16 DUP(20H),0AH,0DH,'$'
D DW 10
O DW 8
B DW 2
H DW 16
pkey db按任意键... $
结束

堆栈段
dw 128 dup(0)
结束

代码段
start:
;设置段寄存器:
mov ax,data
mov ds,ax
mov es,ax
;在这里添加你的代码
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;输出字符串在ds:dx

;等待任何钥匙....
mov啊,1
int 21h

mov ax,4c00h;退出操作系统。
int 21h
结束

结束开始;设置入口点并停止汇编程序。





 name Calc 
数据段
ETR DB 0AH,0DH,'$'
NUM1 DB 0
NUM2 DB 0
结果DB 5 DUP('0'),'$'
TEMP DB 10

数据结束

sseg段堆栈
sseg结束

代码段
假设cs:code,ds:data,ss:sseg
开始:
mov ax,数据
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,结果
MOV AH,9
INT 21H

RET
; -----------------------





我尝试了什么:



i试图在线查看如何从用户那里获得输入并制作我需要的这个菜单但我无法想象它......在那个小小的项目上花了不少时间,现在陷入了挫折..

解决方案

'
D DW 10
O DW 8
B DW 2
H DW 16
pkey db按任意键...



结束

堆栈段
dw 128 dup(0)
结束

代码段
start:
;设置段寄存器:
mov ax,data
mov ds,ax
mov es,ax
;在这里添加你的代码
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;输出字符串在ds:dx

;等待任何钥匙....
mov啊,1
int 21h

mov ax,4c00h;退出操作系统。
int 21h
结束

结束开始;设置入口点并停止汇编程序。





 name Calc 
数据段
ETR DB 0AH,0DH,'


'
NUM1 DB 0
NUM2 DB 0
结果DB 5 DUP('0'),'

write a program in 8086 with these demands:
1. input 2 numbers from the user (no need to check the integrity of the input)
2. Subtraction and ADD action between the 2 numbers
3. divide action between the 2 numbers
4. muliplication action between the 2 numbers
5. print the result on the screen in DECIMAL or BINARY or HEXA depending on choice
how it works: the program will first get a key press and will act on that choice
'0' - input 2 numbers
'1' - ADD action
'2' - Substraction action
'3' - Multiplication
'4' - divide
'5' - print
__________________

D - print in decimal
H - print in hexa
B - print in binary
'0' - Exit program


Im stuck on making this program... any one can help? this are the codes i did so far but got stuck on how to progress

; 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
;-----------------------



What I have tried:

i tried looking online on how to get input from user and make this menu i need but i cant figure it out.. endless of hours on that tiny project and now stuck with frustration..

解决方案

' 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'),'


这篇关于程序集8086中的计算器项目 - 帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆