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

📄 alu.asm

📁 用汇编语言编写的运算器
💻 ASM
字号:
STACK SEGMENT PARA STACK  'STACK'
      DB 256 DUP (?)
STACK ENDS
DATAS SEGMENT
INDATA1   DB        4           
          DB        0
          DB        4	DUP(?)  
NUMBER1  DB  7
         DB  0
         DB  7   DUP(?)
NUMBER2  DB  7
         DB  0
         DB  7   DUP(?)
X        db  7        ;存放判断信号
m        db  7        ;存放第一个操作数
n        db  7        ;存放第二个操作数
z        db  7        ;存放结果(作除法是存放商)
zz       db  7        ;当作除法是存放余数
MESSAGE1          db      '000-! 001-& 010-|| 011-^ $'       ;提示输出信息
MESSAGE2          db      '100-+ 101-- 110-* 111-% $'
MESSAGE3          db     0AH , 'Please choose:$'
INPUT_MESSAGE1    db     0AH , 'Please input A NUMBER:$'
INPUT_MESSAGE2    db     0AH , 'Please input A NUMBER:$'
OUTPUT_MESSAGE    db     0AH , 'RESULT:$'
OUTPUT_MESSAGE1   db     0AH , 'SHANG:$'
OUTPUT_MESSAGE2   db     09H , 'YUSHU:$'
OUTPUT_MESSAGE3   db     0AH , 'YOU INPUT:$'
DATAS ENDS

STACKS SEGMENT
STACKS ENDS

CODES SEGMENT
      ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:   
         MOV AX , DATAS
         MOV DS , AX
	 
	 

         MOV DX ,OFFSET MESSAGE1            ;显示提示信息 000-!(非)      001-&(与)       010-|| (或)      011-^(异或) 。。。。。 
         MOV AH, 9							;类如 输入   000   表示进行非运算		
         INT 21H        
         MOV DX ,OFFSET MESSAGE2			;输入的数字是以2进制为单位 用1或0表示,单个字节大于1的取8位的最后一位
         MOV AH, 9
         INT 21H
         MOV DX ,OFFSET MESSAGE3
         MOV AH, 9
         INT 21H


BEGIN:        MOV       DX , OFFSET INDATA1       ;选择运算类型 000-!(非)      001-&(与)       010-|| (或)      011-^(异或) 。。。。。 
     		  MOV       AH , 0AH					;类如 输入   000   表示进行非运算	
              INT       21H         			
              MOV       CL ,  INDATA1+1         ;输入的字符个数 即循环的次数
              MOV       CH , 0
              ;DEC       CL         
              MOV       BX , OFFSET INDATA1+2   		;读入字符串长度 详细见下面
              MOV       AX,0
       GET1:  MOV       AL,[BX]							;开始用循环读入字符串
              AND       AL,0FH
              DEC       CL								 ;00000000  	第一个操作数 循环左移(cl-1)次 	然后ax低八位放入ax高八位  cl这个循环参数是递减的	
              ROL       AL,CL							 ;00000000		第二个操作数 循环左移(cl-2)次		然后ax低八位放入ax高八位
              INC       CL							     ;00000000		第三个操作数 循环左移(cl-3)次		然后ax低八位放入ax高八位
              ADD       AH,AL							;三个相加就是结果一个循环就多左移一位
              INC       BX
              LOOP      GET1								;循环结束
              CMP       INDATA1+2,0					;ASCII值为00H  可能是溢出
              JNZ       GETD1
              ADD       AH,10000000B
      GETD1:  MOV       bx,ax
         	  mov al , bh
        	  MOV AH , AL
        	  MOV X  , AH       ;将运算判断信号放入内存
               
         
         
         CMP AL , 000b		;先判断是不是非操作,因为只有一个操作数
         JE  FF				;al==000b 就挑FF

         MOV DX ,OFFSET INPUT_MESSAGE1  ;提示输入第一个操作数  
         MOV AH, 9
         INT 21H

         MOV DX , OFFSET NUMBER1		;读入字符NUMBER1这个字符串的第一个字节表示字符串的最大长度,第二个字节是实际长度,最后一个字节是回车符号
         MOV AH , 0AH
         INT 21H

         MOV CL , NUMBER1+1				;读入第二个字节 这个字符串的长度 用作循环次数的参数
         MOV CH ,0            ;dec cl
         MOV BX , OFFSET NUMBER1+2		;开始读入字符串的第一个字节 
         MOV AX , 0

IN1:     MOV AL , [BX]
         AND AL , 0FH
         DEC CL
         ROL AL , CL
         INC CL
         ADD AH , AL
         INC BX
         LOOP IN1						;循环结束 读入过程见上
         CMP NUMBER1+2,0
         JNZ INTO1
         ADD AH ,10000000B

INTO1:   MOV BX , AX

FF:      MOV DX ,OFFSET INPUT_MESSAGE2				;提示输入
         MOV AH, 9
         INT 21H

         MOV DX , OFFSET NUMBER2
         MOV AH , 0AH
         INT 21H

         MOV CL , NUMBER2+1
         MOV CH ,0
         ;dec cl
         MOV DX , BX                                               ;将BX的值转入DX 第一个操作数转存
         MOV BX , OFFSET NUMBER2+2
         MOV AX , 0

IN2:     MOV AL , [BX]
         AND AL , 0FH
         DEC CL
         ROL AL , CL
         INC CL
         ADD AH , AL
         INC BX
         LOOP IN2
         CMP NUMBER2+2,0												;循环输入结束 内容同上
         JNZ INTO2
         ADD AH , 10000000B
																		
INTO2:   MOV BX , AX	;保存第二个操作数


         
         MOV CH , X    ;从内存中取出运算类型信号
         MOV AL , DH	;第一个操作数
         MOV BL , BH	;第二个操作数
         mov m  , dh    ;将操作数存入相应内存
         mov n  , bh

BIJIAO:  CMP CH , 000b   ;判断运算类型
         JE  FEI
         CMP CH , 001b
         JE  YU
         CMP CH , 010b
         JE  HUO
         CMP CH , 011b
         JE  YIHUO
         CMP CH , 100b
         JE  JIA
         CMP CH , 101b
         JE  JIAN
         CMP CH , 110b
         JE  CHENG
         CMP CH , 111b
         JE  CHU

FEI:     
         and bl ,00111111b
         NOT BL
         mov cl , 2
         shl bl , cl
         mov cl , 6
         mov z  , bl
         JMP OU

YU:      
         AND AL , BL
         MOV BL , AL
         mov cl , 2
         shl bl , cl
         mov cl , 6
         mov z  , bl
         JMP OU

HUO:    
         OR  AL , BL
         MOV BL , AL
         mov cl , 2
         shl bl , cl
         mov cl , 6
         mov z  , bl
         JMP OU

YIHUO:  
         XOR AL , BL
         MOV BL , AL
         mov cl , 2
         shl bl , cl
         mov cl , 6
         mov z  , bl
         JMP OU

JIA:   
         ADD AL , BL
         MOV BL , AL
         mov z  , bl
         mov cl , 8
         JMP OU 

JIAN:   
         SUB AL , BL
         MOV BL , AL
         mov z  , bl
         mov cl ,8
         JMP OU 
         
CHENG:   
         mul bl
         MOV BL ,al 
         mov z  , bl
         mov cl , 8
         JMP OU 
            
CHU:     xor ax,ax
	
         MOV AL , DH
         MOV BL , BH
         div BL
         MOV BL , al
         mov z  , al
         mov zz  , ah


		;这里是处理除数的输出 有两个输出值
OU1:    mov cl , 8
        MOV  DX , OFFSET OUTPUT_MESSAGE1            ;换行
        MOV  AH , 9
        INT  21H 
                     
AA:     SHL  BL , 1
        JC   BB
        MOV  DL , 30H           
        MOV  AH , 2
        INT  21H
        DEC  CL
        JNZ  AA
        JMP  PP
        
BB:     MOV  DL , 31H
        MOV  AH , 2
        INT  21H
        DEC  CL
        JNZ  AA  
PP:     MOV BL , zz
        mov cl , 8 
        MOV  DX , OFFSET OUTPUT_MESSAGE2            ;换行
        MOV  AH , 9
        INT  21H
        JMP A     

		;这里是输出第二个结果

OU:     
        MOV  DX , OFFSET OUTPUT_MESSAGE            ;换行
        MOV  AH , 9
        INT  21H 
                     
A:      SHL  BL , 1
        JC   B
        MOV  DL , 30H           
        MOV  AH , 2
        INT  21H
        DEC  CL
        JNZ  A
        JMP  E
        
B:      MOV  DL , 31H
        MOV  AH , 2
        INT  21H
        DEC  CL
        JNZ  A       
                
       
E:      MOV AH,4CH
        INT 21H
        
CODES ENDS
    END START

⌨️ 快捷键说明

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