![]() |
#2
mobileangle2010-05-31 15:32
多读了一下,自己读出来了——
data segment input db 0ah, 0dh, 'Please input a Dioxde number:', '$' str db 0ah,0dh num db 4 dup(?),'H$' tab db '0123456789ABCDEF' data ends code segment assume cs:code,ds:data begin: mov ax,data mov ds,ax xor bx,bx ;操作数自身异或,值不变,可使进位标志CF=0, 可以清0。速度比赋值快.还可以做位运算。 mov cx,10 mov dx, offset input mov ah, 9 int 21h next: mov ah,1 ;1号功能:按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符 int 21h cmp al,0dh jz conv ;判断al是否等于0DH,即回车键 push ax ;输入的数据压入栈中 mov ax,bx ;按数据输入的顺序,决定个、十、百、千位 mul cx mov bx,ax pop ax and al,0fh ;取AL低位 xor ah,ah ;AX高位清零,这两步实现了把输入数据减去30H的功能 add bx,ax ;AX移入BX jmp next ;在AL=0dH前一直执行NEXT循环,即按下回车键前一直输入数据 conv: mov ax,bx mov ch,4 lea bx,tab mov cl,4 lea si,num lopa: rol ax,cl ;AX左循环四位,增大了16倍,AL值进入了AH push ax and ax,000fh ;取AX低四位 xlat ;把待查表格的一个字节内容送到AL累加器中 mov [si],al ;表格数据存放入num inc si ;指向num下一位 pop ax dec ch ;lopa循环4次后退出 jnz lopa lea dx,str ;换行回车后未退出,继续打印num中数据直到$处退出 mov ah,9 int 21h mov ah,4ch int 21h code ends end begin |
data segment
input db 0ah, 0dh, 'Please input a Dioxde number:', '$'
str db 0ah,0dh
num db 4 dup(?),'H$'
tab db '0123456789ABCDEF'
data ends
code segment
assume cs:code,ds:data
begin: mov ax,data
mov ds,ax
xor bx,bx ;操作数自身异或,值不变,可使进位标志CF=0, 可以清0。速度比赋值快.还可以做位运算。
mov cx,10
mov dx, offset input
mov ah, 9
int 21h
next: mov ah,1 ;1号功能:按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符
int 21h
cmp al,0dh
jz conv ;判断al是否等于0DH,为什么是0Dh???
push ax
mov ax,bx ;把bx=0移入ax,ax也未零了???
mul cx ;0和CX相乘???
mov bx,ax ;零移入零???
pop ax
and al,0fh ;取AL低位
xor ah,ah ;AL高位清零
add bx,ax ;AX移入BX
jmp next ;在AL=0dH前一直执行NEXT循环
conv: mov ax,bx
mov ch,4
lea bx,tab
mov cl,4
lea si,num
lopa: rol ax,cl ;AX左循环四位
push ax
and ax,000fh ;取AX低四位
xlat ;把待查表格的一个字节内容送到AL累加器中
mov [si],al ;表格数据存放入num
inc si ;指向num下一位
pop ax
dec ch ;lopa循环4次后退出
jnz lopa
lea dx,str ;换行回车后未退出,继续打印num中数据直到$处退出
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end begin