前面的:那不是输入AH吗?怎么又变成AL了呢?
后面的:转移倒是知道,但我不知道这段对整个程序来说有什么用处,为什么要和ODH比?
谢谢你的回答
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二个值来进行标准换行
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编辑过]