注册 登录
编程论坛 汇编论坛

[求解释]10进制输入16进制输出

cenriter 发布于 2006-12-05 10:04, 2299 次点击

题目:把一个65535以内的十进制数转换成十六进制形式,并送显示,如:
                                                                                                         输入       65535
                                                                                                         输出        FFFF

6楼的大哥写的都对,但我是初学者,看不大懂,有哪位能帮我解释下?拜托了~!

[此贴子已经被作者于2006-12-10 21:15:22编辑过]

16 回复
#2
hu9jj2006-12-05 20:36
你可以在程序开始时先关闭光标,结束时再打开光标。
#3
曾小2006-12-06 11:45
什么意思 啊?
版主说清啊!是不是我太糗了?
#4
cenriter2006-12-06 15:27
回复:(曾小)什么意思 啊?版主说清啊!是不是我太糗了...
字符串65535在输入的时候会变成 36H 35H 35H 33H 35H 。然后都减30H,变成6 5 5 3 5 ,各乘以各自的位数,比如6*10000,5*1000。最后让它们相加,变成十进制的65535,这样存进去的时候,计算机会自动转换成16进制。

对了,减30H 后的是 6H 5H 5H 3H 5H ,不是十进制。
哪位有新的办法或者能把65535变成十进制。

小弟初学,说不清楚的地方,大家见谅啊
#5
公子吕2006-12-06 15:56

好久没来这里也好久没用汇编了,其实以前我发过两个很实用的过程(函数)itoa & atoi,用来将用户想转换的数(int,long,etc..)转换成数字字符串,和 把需要的数字字符串转换为数。有了这两个过程,写汇编就容易多了。

你的程序好像只能转换65535吧,这样的程序太弱了,根本都不需要用户输入。我有空会帮你改写一下,还有一个建议,程序最好配上简单的注释。。

代码写好后再贴上。

#6
noble2006-12-06 20:05


code segment
assume cs: code
org 100h
start:

MOV bx, 0

input : MOV ah, 01
int 21h ;
; cmp al, 65H
; JZ EXIT
cmp al, 0dh
jz write ;
sub al, 30h
MOV cl, al
MOV ch, 0
MOV ax, bx
MOV bx, 0ah ;
mul bx
MOV bx, ax
add bx, cx
jmp input

write : MOV dl, 0dh
MOV ah, 02h
int 21h
MOV dl, 0ah
MOV ah, 02
int 21h ; 输出回车和换行

MOV dh, 2 ;
CC : MOV si, 2 ;
BB: MOV AH, 0
MOV AL, BH

MOV CL, 4

SHL AX, CL ;

cmp ah, 10
MOV BH, al
jC disp
add ah, 7

disp: add ah, 30h
MOV dl, ah
MOV ah, 02
int 21h

dec si
mov cx, si
jcxz disp1
jmp bb
disp1 : MOV bh, bl
dec dh

jnz cc


EXIT: MOV AH, 1
INT 21H

MOV AH, 4CH
INT 21H

code ends
end start

#7
公子吕2006-12-06 21:48
省力了。。。
#8
cenriter2006-12-07 12:25

谢谢,这个程序可行,我还得看懂下。我那种方法不知道能不能做

#9
cenriter2006-12-10 20:45
大哥,解释下,我看了半天还是晕头转向的,你的算法是什么?

mov ah,01
int 21h
是指输入的字符保存在AH内?

cmp al,0dh
jz write
这句的功能是什么?
#10
lefttime2006-12-11 17:51
mov ah,01
int 21h
指的是从键盘输入数值并存入AL中
cmp al,0dh
jz write
表示的是让AL中的数值与0dh相比较,如果相等则转移到write执行,如果不等则顺序执行
#11
cenriter2006-12-11 18:02

前面的:那不是输入AH吗?怎么又变成AL了呢?
后面的:转移倒是知道,但我不知道这段对整个程序来说有什么用处,为什么要和ODH比?

谢谢你的回答

#12
lefttime2006-12-11 18:18
输入的是AH,它代表的是中断号,是用于调用DOS中断,通过BIOS中断后开始等待用户输入数据,输入的数据存入AL中嘛
#13
cenriter2006-12-11 18:23

知道了

cmp al, 0dh
jz write ;
sub al, 30h
MOV cl, al
MOV ch, 0
MOV ax, bx
MOV bx, 0ah ;
mul bx
MOV bx, ax
add bx, cx
jmp input

write : MOV dl, 0dh
MOV ah, 02h
int 21h
MOV dl, 0ah
MOV ah, 02
int 21h

那这两段什么意思呢?为什么要存0和与0DH比较呢?

#14
lefttime2006-12-11 18:55

org 100h ;代码区从0100H处开始,这样可用于建立.com程序
start: MOV bx, 0 ;对BX清零,准备用于累加输入数的实际值
input : MOV ah, 01 ;1号中断输入接收字符ASCII码
int 21h
cmp al, 0dh ;输入10进制数以回车结束,这里判断是不是回车,如果是就直接输出结果啦
jz write
sub al, 30h ;转换成实际数值
MOV cl, al
MOV ch, 0 ;上行开始赋值,(CX)=(AL),用CX来暂存数值
MOV ax, bx ;返回上一次输入的数转换成10进制后的值
MOV bx, 0ah ;BX用作进制数中的权
mul bx
MOV bx, ax ;把结果暂存在BX中
add bx, cx ;把刚刚存放在CX中的值加进来,准备下一次的累加
jmp input ;强制转移到input执行

write : MOV dl, 0dh ;0dh是回车键的ASCII码
MOV ah, 02h
int 21h ;执行后相当于回车
MOV dl, 0ah ;0ah是换行的ASCII代码
MOV ah, 02
int 21h ;执行后就相当于换行啦
汇编中比较麻烦,不像C/C++中一个'\n'、一个endl就可以解决换行后直接到首格,只好调用CR、LF二个值来进行标准换行

#15
cenriter2006-12-11 19:52

帮我看看下面的

[此贴子已经被作者于2006-12-11 22:22:15编辑过]

#16
lefttime2006-12-11 19:57

呵呵~~~注意看看一些计算机书后,大部分都会有说明
ASCII码中00-1F都是属于控制符号,以后编程多注意自然就记住啦

#17
cenriter2006-12-11 22:22

code segment
assume cs: code
org 100h
start:

MOV bx, 0

input : MOV ah, 01
int 21h
cmp al, 0dh
jz write ;
sub al, 30h
MOV cl, al
MOV ch, 0
MOV ax, bx
MOV bx, 0ah
mul bx ;乘以0AH而不是10H,一直理解错就在这里。
MOV bx, ax
add bx, cx
jmp input

write : MOV dl, 0dh
MOV ah, 02h
int 21h
MOV dl, 0ah
MOV ah, 02
int 21h ; 输出回车和换行

;例如我们输入“65535”,到这里为止BX中就是0FFFFH

MOV dh, 2
CC : MOV si, 2
BB: MOV AH, 0
MOV AL, BH ;BX中的BH给AL,那这时候AX变成了00FFH

MOV CL, 4

SHL AX, CL ;AX变成0FF0H

cmp ah, 10 ;AH=0FH
MOV BH, al ;BH=0F0H
jC disp ;AH小于,则CF=1,则跳转DISP
add ah, 7 ;这里是为了A到F的输出

disp: add ah, 30h
MOV dl, ah
MOV ah, 02
int 21h

dec si ;循环1次
mov cx, si
jcxz disp1
jmp bb
disp1 : MOV bh, bl
dec dh ; 像做BH一样处理BL

jnz cc


EXIT: MOV AH, 1
INT 21H

MOV AH, 4CH
INT 21H

code ends
end start


[此贴子已经被作者于2006-12-12 20:12:49编辑过]

1