用汇编语言实现多种数制的通用输入方法

时间:2022-09-23 03:14:26

用汇编语言实现多种数制的通用输入方法

摘要:把从键盘输入的二进制、八进制、十进制、十六进制字符数据转换成计算机能够识别的二进制数据,给出了各种进制通用的输入、转换方法及汇编语言程序段,通过字符串本身可以判断数制

关键词:汇编语言 转换 数制 通用输入方法

中图分类号:TP313 文献标识码: B 文章编号:1002-2422(2008)01-0059-02

1 编程思路

1.1输入数值字符串

利用DOS系统功能的10号调用,把需要的数值从键盘输入,此时输入的是字符串。在利用10号调用时,要注意缓冲区BUF的设定,其格式为:

BUF DB 18

DB ?

DB 18 DUP(0)

1.2判断数制

字符串输入后,先判断输入数据的进制。通过缓冲区中回车符前面的字符来判断。这个字符只能是字符串“0123456789BbOoQqHh”中的一个,否则输入的数据错误,程序结束。此字符若为“B”或“b”则是二进制数;若为“O”、“o”、“Q”、“q”中的任一字符,则是八进制;若为“D”、“d”或“0”~“9”之间的任一字符,则是十进制数;若为“H”或“h”则是十六进制数。

1.3字符数据转换为数值数据

需要把字符串中的每个字符数据转换为其对应的数值数据。对于二、八、十进制数,只要将其减去30H即可;对于十六进制,因“A”~“F”或“a”~“f”表示数值10-15,若字符在“0”~“9”之间,则减去30H;若在“A”~“F”之间,则减去37H;若在“a”~“f”,之间,则减去57H。

1.4数值数字转换成二进制数

把得到的数值数字d1d2……dn通过每种数制的基数转换成二进制数。d1d2……dn可用如下公式计算得到二进制形式:

(…(d1*基数+d2)*基数+…)*基数+dn二、八、十、十六进制的基数分别为2、8、10、16。例如十进制数3472=((3*10+4)*10+7)*10+2。

二、八、十进制的数字符号均在0-9之间,可用同一转换子程序con-vert实现,只要改变一些传递的参数即可。十六进制有“A”~“F”、“a”~“f”数字字符,情况特殊,单独用一个子程序coil-vert16转换。

2 汇编语言源程序实例

;num1:不同数制的基数

;low:基数的最小数字符号

;high:基数的最大数字符号

init macro num1,low,high

dee bur+1

mov num,num 1

moY cl,low

moY eh,high

endm

data segment

bur

db 18

db?

db 18 dup(0)

str db‘0123456789BbOoQqDdHh’

count equ S-sir

nuln

dw?

loopnum db?

data

ends

stack segment stack

db 100 dup(0)

stack ends

code segment

assume cs:code,ds:data,ss:stack

start: mov ax,data

mov ds,aX

lea dx,buf

mov ah.10

int 21h

mov si,offset buf+2

mov bl,buf+1

mov bh,0

mov a1,-1[bx+si]

mov cx,connt

lea si,str

;判断输入的数据是否是所需进制

lop0: cmp al,[si]

jz lab1

inc si

lcop lop0

jmp exit

lab1: cmp al,‘m’

jnz lab2

init 2,‘0’,‘1’

call convert

jmp exit

lab2: cmp a1,‘b’

jnz lab3

init 2,‘0’,‘1’

call convert

jmp exit

lab3: cmp al,‘0’

jnz lab4

init 8,‘0’,‘7’

call convert

jmp exit

lab4: cmp al,‘0’

jnz lab5

init 8,‘0’,‘7’

call convert

jmp exit

lab5: cmp al,‘Q’

jnz lab6

init 8, ‘0’,‘7’

call convert

jmp exit

lab6: cmp al,‘q’

jnz lab7

init 8,‘0’,‘7’

call convert

jmp exit

lab7: cmp al,‘H’

jnz lab8

call convert16

jmp exit

lab8: cmp al,‘h’

jnz lab9

cell convert16

jmp exit

lab9: cmp al,‘0’

jnz lab10

init 10,‘0’,‘9’

call convert

jmp exit

lab10:cmp al,‘d’

jnz lab11

init 10,‘0’,‘9’

call convert

jmp exit

lab11:inc buf+1

init 10,‘0’,‘9’

call conyelt

jmp exit

;二、八、十进制转换子程序

convert proc

mov si.offset buf+2

mov al,buf+1

mov lcopnurn,al

nov ax,0

mov dx,0

lop10:mul num

jc

exit;

mov bl,[si]

cmp bl,cl

jb exit

cmp b1,ch

ja exit

sub bl,30h

mov bh,0

add ax,bx

inc si

dec lcopnum

jnz lop10

ret

convert endp

;十六进制转换子程序

convertl6 proc near

mov si.offset buf+2

dec buf+1

mov cl,lbuf+1

mov ax,0

mov dx,0

mov num,16

lop16:mul num

jc exit;

mov bl,[si]

cmp bl,‘0’

jb exit

cmp bl,‘9’

ja con1

sub bl,30h

jmp con3

conl: cmp bl,‘A’

jb exit

cmp bl,‘F’

ja con2

Bub bl,37h

jmp con3

con2: cmp bl,‘a’

jb exit

cmp bl,‘f’

ja exit

sub bl,57h

con3: mov bh,0

add ax,bx

inc si

dec cl

jnz lop16

ret

convert16 endp

exit: mov ah,4ch

int 21h

code

ends

end start

3 结束语

在输入的所有字符中,程序均支持大小写。例如可以输入:101010001011B、6520、28594、6dB4h,分别表示二、八、十、十六进制数。程序经过汇编、连接后,形成可执行文件,也可以稍加修改成为一个子程序。

上一篇:用AUthorware构建多媒体学生管理系统 下一篇:特洛伊木马隐蔽性研究