⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycode2-3.asm

📁 利用软中断实现加减乘除4则运算
💻 ASM
字号:
; multi-segment executable file template.

data segment PARA PUBLIC 'DATA'  
  NUM1 DW '?'
  NUM2 DW '?' 
  OPR DB '?'

DATA ends

stack segment PARA STACK 'STACK'
    dw   128  dup(0)
STACK ends 
    
PUTC    MACRO   char
        PUSH    AX
        MOV     AL, char
        MOV     AH, 0Eh
        INT     10h     
        POP     AX
ENDM    

code segment PARA PUBLIC 'CODE'   
    assume cs:code
start:
; set segment registers:   
    mov ax, data
    mov ds, ax
    mov es, ax
    assume ds:data




   
MOV AX,OFFSET PLUS
MOV DX,AX
MOV AX,SEG PLUS
MOV DS,AX
MOV AL,60H
MOV AH,25H
INT 21H
STI


MOV AX,OFFSET MINUS
MOV DX,AX
MOV AX,SEG MINUS
MOV DS,AX
MOV AL,61H
MOV AH,25H
INT 21H
STI


MOV AX,OFFSET MULT
MOV DX,AX
MOV AX,SEG MULT
MOV DS,AX
MOV AL,62H
MOV AH,25H
INT 21H
STI


MOV AX,OFFSET DIVI
MOV DX,AX
MOV AX,SEG DIVI
MOV DS,AX
MOV AL,63H
MOV AH,25H
INT 21H
STI
        MOV CX,0
 L1:    MOV     AH, 00h
        INT     16h
        ; and print it:
        MOV     AH, 0Eh
        INT     10h
  
        cmp AL,"/"
        JNA STORE_OPR 
        MOV AH,00H
        SUB AX,30H
        MOV NUM1,AX
         
JMP L1          
   
           

        
STORE_OPR: 
           MOV OPR,AL  
           
  L2:   MOV     AH, 00h
        INT     16h
        ; and print it:
        MOV     AH, 0Eh
        INT     10h
        CMP AL,"="
        JE CAL 
        MOV AH,00H
        SUB AX,30H
        MOV NUM2,AX  
        JMP L2   
CAL:
cmp OPR, '+'
je do_plus

cmp OPR, '-'
je do_minus

cmp OPR, '*'
je do_mult

cmp OPR, '/'
je do_div

do_plus: INT 60H
do_minus: INT 61H
do_mult: INT 62H
do_div: INT 63H




plus:


mov ax, num1
add ax, num2 
call print_num    ; print ax value.

jmp exit



minus:

mov ax, num1
sub ax, num2
call print_num    ; print ax value.

jmp exit

mult:

mov ax, num1
imul num2 ; (dx ax) = ax * num2. 
call print_num    ; print ax value.
; dx is ignored (calc works with tiny numbers only).

jmp exit

divI:
; dx is ignored (calc works with tiny integer numbers only).
mov dx, 0
mov ax, num1
idiv num2  ; ax = (dx ax) / num2.
call print_num
putc ' '
putc 'r' 
putc ' '
mov ax,dx
call print_num
jmp exIT
          
          
PRINT_NUM       PROC    NEAR 
    
       CMP AX,00H
       JNS GO
       PUTC '-' 
       NEG AX
  GO:  MOV BL,100 
       DIV BL
       MOV CL,AL 
       CMP AL,00H
       JZ L3
       CALL BTOASC 
       CALL DISCHAR
        
   L3: MOV AL,AH 
       MOV AH,0 
       MOV BL,10 
       DIV BL
       ADD CL,AL
       CMP CL,00H
       JZ L4 
       CALL BTOASC 
       CALL DISCHAR 
   L4:  
       MOV AL,AH 
       CALL BTOASC 
       CALL DISCHAR 
     ret  
PRINT_NUM   ENDP


EXIT: MOV AH,4CH
      INT 21H

BTOASC PROC NEAR 
       ADD AL,30H 
       RET 
BTOASC ENDP  

DISCHAR PROC NEAR
	PUSH BX 
	PUSH AX 
	MOV BX,0 
	MOV AH,0EH 
	INT 10H 
	POP AX 
	POP BX 
	RET 
DISCHAR ENDP 
        
CODE ends

end start ; set entry point and stop the assembler.
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -