汇编十进制输入输出详解,各种进制输入输出
Posted Afololer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编十进制输入输出详解,各种进制输入输出相关的知识,希望对你有一定的参考价值。
注意:
输入的是ascll码,'0’对应的是30H,减去30在寄存器存的才是0,如果输入不在范围内,不增加到寄存器
获取输入’0’,30H之后的处理
- 减去30H,如果是A~Z则减去55,因为’A’为41H,即65
- 每次接收新一位数时,前面的数都应乘相应进制
- 再加上新一位的数
- 没有接收到回车时,2、3循环
十六进制输入十进制输出(输入存在bx寄存器)
DATAS SEGMENT
;此处输入数据段代码
num db 65,48,48,48,10
crlf db 10,13,'$' ;换行
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc
START:
MOV AX,DATAS
MOV DS,AX
call Hin ;十六进制输入 A000
call crl
call output ;十进制输出
MOV AH,4CH
INT 21H
ret
main endp
Hin proc
mov bx,0
mov ax,0
mov dl,16
mov si,0
L1:
mov cl,4
mov al,num[si]
inc si
cmp al,10
jz ou
cmp al,30H
JB ou
cmp al,39H
JA char
sub al,30H
rol bx,cl
add bx,ax
JMP L1
char:
cmp al,41H
JB ou
cmp al,46H
JA ou
sub al,55
rol bx,cl
add bx,ax
JMP L1
ou:
ret
Hin endp
crl proc
push dx
push ax
lea dx,crlf
mov AH,9
int 21H
pop ax
pop dx
ret
crl endp
output proc
mov cx, 10000d
call dec_div
mov cx, 1000d
call dec_div
mov cx, 100d
call dec_div
mov cx, 10d
call dec_div
mov cx, 1d
call dec_div
ret
output endp
dec_div proc
mov ax, bx
mov dx, 0
div cx
mov bx, dx
mov dl, al
add dl, 30h
mov ah, 2
int 21h
ret
dec_div endp
CODES ENDS
END START
十进制输入输出(难点)
- 留的空间不能是5,否则无法输入空格
- 要用ax进行乘10,否则只能算0~255,此时每次输入ah要清零,因为是两个数连着输入的
- 数存在bx,因为ax经常变
- 不能用dx做临时的寄存器,因为ax进行mul操作后dx会清零
DATAS SEGMENT
;此处输入数据段代码
num db 6,?,6 dup(?)
;num db 49,5,51,48,48,48,48,10
N dw 10
crlf db 10,13,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc
START:
MOV AX,DATAS
MOV DS,AX
call Oin
call crl
call output
;此处输入代码段代码
MOV AH,4CH
INT 21H
ret
main endp
Oin proc
lea dx,num
mov ah,10
int 21h
mov cl,num+1
mov si,2
L1:
mov ax,word ptr num[si]
mov ah,0
add si,1
cmp ax,10
JZ ou
cmp ax,30h
Jb L1
cmp ax,39h
ja L1
sub ax,30H ;
push ax
xchg ax,bx
mul N ;不能mov si,10 mul si,会当成16位乘
xchg ax,bx
pop ax
add bx,ax
jmp L1
ou:
ret
Oin endp
crl proc
push dx
push ax
lea dx,crlf
mov AH,9
int 21H
pop ax
pop dx
ret
crl endp
output proc
mov cx, 10000d
call dec_div
mov cx, 1000d
call dec_div
mov cx, 100d
call dec_div
mov cx, 10d
call dec_div
mov cx, 1d
call dec_div
ret
output endp
dec_div proc
mov ax, bx
mov dx, 0
div cx
mov bx, dx
mov dl, al
add dl, 30h
mov ah, 2
int 21h
ret
dec_div endp
CODES ENDS
END START
二进制输入
KEY PROC NEAR
PUSH AX
XOR DX,DX
L1: MOV AH,1
INT 21H
CMP AL,0DH
JZ BACK
CMP AL,30H
JB L1
CMP AL,31H
JA L1
AND AX,1
SHL DX,1
ADD DX,AX
JMP L1
BACK: POP AX
RET
KEY ENDP
以上是关于汇编十进制输入输出详解,各种进制输入输出的主要内容,如果未能解决你的问题,请参考以下文章