📄 完成实验一.asm
字号:
LF equ 0ah ;回车16进制码
DATAS SEGMENT
;此处输入数据段代码
STRX DB 7,0,6 DUP(0)
STRY DB 7,0, 6 DUP(0)
RESULT DB 7 DUP(?)
FLAG DB 1 ;标志(用于打印结果数)
Msg1 db 'x = ','$'
Msg2 db LF,'y = ','$'
Msg3 db LF,'x+y= ','$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX ;定位数据段
;此处输入代码据段代码
;输入X
LEA DX,Msg1
CALL Puts
LEA DX,STRX
CALL Gets ;将输入的字符传保存在STRX中
;输入Y
LEA DX,Msg2
CALL Puts
LEA DX,Stry
CALL Gets ;将输入的字符传保存在STRY中
XOR CX,CX ;CX计数器清零
MOV CL,STRX+1
LEA SI,STRX+2
;如果位数小于6位,则对末位的后一位进行清零,(因为回车被存储进了)
CMP CX,6
JNC SKIP3
PUSH SI
ADD SI,CX
MOV [SI],BYTE PTR 0
POP SI
SKIP3:
CALL ASC2BIN ;STRX的字符转化为二进制真值
;对X进行位对齐,对低于6位数据进行自适应
XOR CX,CX ;CX计数器清零
MOV CL,STRX+1
LEA SI,STRX+2-1 ;
ADD SI,CX ;定位SI指向数据有效位的最低位的存储单元
LEA DI,STRX+7 ;定位SI指向数据缓冲区的最后一位
CHANGE1:
MOV AL,[SI]
MOV [SI],BYTE PTR 0
MOV [DI],AL
DEC SI ;SI,DI同步自减CX次
DEC DI
CLC ;标志位清零
DEC CX
JNZ CHANGE1
XOR CX,CX
MOV CL,STRY+1
LEA SI,STRY+2
;如果位数小于6位,则对末位的后一位进行清零,(因为回车被存储进了)
CMP CX,6
JNC SKIP4
PUSH SI
ADD SI,CX
MOV [SI],BYTE PTR 0
POP SI
SKIP4:
CALL ASC2BIN ;STRY的字符转化为二进制真值
;对Y进行位对齐,对低于6位数据进行自适应
XOR CX,CX ;CX计数器清零
MOV CL,STRY+1
LEA SI,STRY+2-1 ;
ADD SI,CX ;定位SI指向数据有效位的最低位的存储单元
LEA DI,STRY+7 ;定位SI指向数据缓冲区的最后一位
CHANGE:
MOV AL,[SI]
MOV [SI],BYTE PTR 0
MOV [DI],AL
DEC SI ;SI,DI同步自减CX次
DEC DI
CLC ;标志位清零
DEC CX
JNZ CHANGE
MOV CX,6 ;
LEA SI,STRX+2 ;定位到六位数据头
LEA DI,STRY+2
CLC ;标志位清零
JIA:
MOV AL,[SI+5] ;取DS:SI所指向的内存单元的值赋给AL
ADC AL,[DI+5] ;
AAA ;BCD码加法自动调整
MOV [DI+6+6],AL ;定位RESULT存储最低位,RESULT从存储
DEC SI
DEC DI
LOOP JIA
LEA DI,RESULT
MOV [DI],BYTE PTR 0 ;RESULT最高位置零
JNC SKIP ;若无进位则跳转打印数字
MOV [DI],BYTE PTR 1 ;
SKIP:
XOR CX,CX ;计数器清零
MOV CX,7
LEA DX,Msg3
CALL Puts
JMP DAYIN ;
DAYIN: ;从第一个不为0的数开始打印
CMP DS:FLAG,1
MOV DL,[DI]
JNZ SHOW
CMP DL,00H ;判断首字符是否为0
JZ SKIP1 ;如果首字符为0则跳过设置打印标识符
SETTING: ;设置打印标志位
MOV FLAG,0
;JMP SKIP1 ;跳转
SHOW:
ADD DL,30H ;DL加30h转化为ASCII码
CALL OUTPUT
SKIP1:
INC DI
LOOP DAYIN
MOV AH,4CH
INT 21H
PRINT PROC
MOV AH,9
INT 21H
RET
PRINT ENDP
OUTPUT PROC
MOV AH,2
INT 21H
RET
OUTPUT ENDP
Gets proc
;入口参数:ds:dx = 输入缓冲区首地址
;功能,从键盘读如一个字符串,存入以ds:dx所指的缓冲区
;说明:对缓冲区格式的要求同int 21h的10号功能
push ax
mov ah,10
int 21h
pop ax
ret
Gets endp
Puts proc
;入口参数:ds:dx = 输入缓冲区首地址
;功能,向显示器输出一个字符串,存入以ds:dx所指的缓冲区
;说明:对缓冲区格式的要求同int 21h的9号功能
push ax
mov ah,9
int 21h
pop ax
ret
Puts endp
ASC2BIN PROC
;入口参数:SI=STRX+2 = 输入缓冲区首地址
;功能:将对应内存地址单元中的字符ASCII码转化为二进制真值
;说明:CX计数器的值传入为该缓冲区字符数
A2B:
AND BYTE PTR [SI],0FH
INC SI
DEC CX
JNZ A2B
RET
ASC2BIN ENDP
CRLF PROC
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
RET
CRLF ENDP
CODES ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -