由键盘输入一串整数(length <= 9),将该串转换为整数,并分别按16进制和10进制输出。
整数的长度为9,这样就超过了16位,单纯用8086的运算已经不能满足,加法的进位就会丢失, 而乘除法很可能会出现overflow. 所以要用到32位寄存器,这样就用到386指令. 如果不用386指令,也可以用两个寄存器对高16位和低16位分别进行操作. 下面是用386指令的源代码 ENTER MACRO MOV DL,0AH MOV AH,2H INT 21H MOV DL,0DH MOV AH,2H INT 21H ENDM .model hex .386 .data msg db 'Input numbers (length<=9):$' .stack db 100 dup(?) .code main proc far ;********************************* start: push ds mov ax,0 push ax mov ax,@data mov ds,ax mov dx,offset msg mov ah,9 int 21h call rec enter call tohex enter call dec1 enter ret main endp ;----------------------------------- rec proc near ;子程序rec是用来接收一个长度小于9的整数 mov ebx,0 ;并把它放入ebx中 newnum: mov ah,01 int 21h sub al,30h jl exit cmp al,9d jg exit cbw xchg eax,ebx mov ecx,10d mul ecx xchg eax,ebx add ebx,eax jmp newnum exit: ret rec endp ;------------------------------------ tohex proc near ;子程序tohex是把ebx中的数用16进制输出 mov ch,8 rotate: mov cl,4 rol ebx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl print add al,7h print: mov dl,al mov ah,2h int 21h dec ch jnz rotate ret tohex endp ;---------------------------------- dec1 proc near ;dec1是转化为十进制输出 mov ecx,100000000d call todec mov ecx,10000000d call todec mov ecx,1000000d call todec mov ecx,100000d call todec mov ecx,10000d call todec mov ecx,1000d call todec mov ecx,100d call todec mov ecx,10d call todec mov ecx,1d call todec ret ;-------------------------------- todec proc near mov eax,ebx mov edx,0 div ecx mov ebx,edx mov dx,ax add dl,30h mov ah,02h int 21h ret todec endp dec1 endp ;---------------------------- end main |