📄 alu.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 + -