10进制转16进制汇编程序
;--------------------------------------------;
;Name:十进制(-32768~32767)转换16进制汇编程序-;
;Desccription:输入一个十进制,程序转为该数的-;
;十六进制数从屏幕输出 ;
;Author:160409108 ;
;Date: 2011-11-13 ;
;--------------------------------------------;
DATA SEGMENT
BUF DW 7
DW ?
DW 8 DUP(0)
ORG 10H
DAT1 DW 12 DUP(0)
ORG 20H
FIRST DW ?
ORG 30H
SECOND DB ?
ORG 40H
THIRD DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
LEA BX,BUF
LEA DI,DAT1
;------------------------------------------
;ASC码转换BCD码,若为负数推迟一位转码
;------------------------------------------
mov al,[BX+2]
CMP al,'-'
JNE SP1
INC BX
MOV AL,[BX] ;负数------判断实际输入位数,将DI指针指向相应位置
MOV CL,6
SUB CL,AL
MOV CH,0
LP3:
INC DI
INC DI
LOOP LP3 ;结束
JMP NEXT
SP1:
MOV AL,[BX+1] ;正数------判断实际输入位数,将DI指针指向相应位置
MOV CL,5
SUB CL,AL
MOV CH,0
LP2:
INC DI
INC DI
LOOP LP2 ;结束
NEXT:
MOV AX,[BX+2] ;ASC转BCD码
SUB AX,30H
MOV [BX+2],AX
MOV AX,[BX+3]
SUB AX,30H
MOV [BX+3],AX
MOV AX,[BX+4]
SUB AX,30H
MOV [BX+4],AX
MOV AX,[BX+5]
SUB AX,30H
MOV [BX+5],AX
MOV AX,[BX+6]
SUB AX,30H
MOV [BX+6],AX
;-------------------------------------------
;每位分别存入10h,最后一位为符号值 DW定义
;-------------------------------------------
MOV CX,[BX+1]
LP1:
MOV AL,[BX+2] ;将数据存入10H
MOV [DI],AL
INC BX
INC DI
INC DI
LOOP LP1
;MOV AL,[BX+3]
;MOV [DI+2],AL
;MOV AL,[BX+4]
;MOV [DI+4],AL
;MOV AL,[BX+5]
;MOV [DI+6],AL
;MOV AL,[BX+6]
;MOV [DI+8],AL
LEA BX,BUF
LEA DI,DAT1
MOV AL,[BX+2]
MOV [DI+10],AL ;若为负数则存负号ASC码,不是负数存第二个定义数
;-------------------------------------------
;分别计算各个位的真实值存入20H DW定义 BP
;-------------------------------------------
LEA BP,FIRST
LEA BX,SECOND
LEA DI,DAT1
MOV AX,[DI] ;万位
MOV CX,10000
MUL CX
MOV [BP],AX
MOV AX,[DI+2] ;千位
MOV CX,1000
MUL CX
MOV [BP+2],AX
MOV AX,[DI+4] ;百位
MOV CX,100
MUL CX
MOV [BP+4],AX
MOV AX,[DI+6] ;十位
MOV CX,10
MUL CX
MOV [BP+6],AX
MOV AX,[DI+8] ;个位
MOV CX,1
MUL CX
MOV [BP+8],AX
;-------------------------------------------
;分别相加存入30H DW定义 BX
;-------------------------------------------
MOV AX,[BP]
ADD AX,[BP+2]
ADD AX,[BP+4]
ADD AX,[BP+6]
ADD AX,[BP+8]
MOV [BX],AX
;-------------------------------------------
;判定正负数,负数转补码
;-------------------------------------------
MOV AX,[DI+10]
CMP AX,'-'
JNE JP9
MOV AX,[BX]
NEG AX
MOV [BX],AX
JP9:
;-------------------------------------------
;判断每四位数值真值,<=或是>9,由此给定ASC码值
;-------------------------------------------
LEA DI,THIRD
MOV AX,[BX]
AND AX,000FH
CMP AL,9
JG JP3 ;若大于9,加37H转换为ABCD。。的ASC码
ADD AL,30H ;若小于等于9,加30H转换1234。。的ASC码
JMP NEXT1
JP3:
ADD AL,37H
NEXT1:
MOV [DI],AL
INC DI
MOV CL,4
MOV AX,[BX]
SHR AX,CL
AND AX,000FH
CMP AL,9
JG JP4
ADD AL,30H
JMP NEXT2
JP4:
ADD AL,37H
NEXT2:
MOV [DI],AL
INC DI
MOV CL,8
MOV AX,[BX]
SHR AX,CL
AND AX,000FH
CMP AL,9
JG JP5
ADD AL,30H
JMP NEXT3
JP5:
ADD AL,37H
NEXT3:
MOV [DI],AL
INC DI
MOV CL,12
MOV AX,[BX]
SHR AX,CL
AND AX,000FH
CMP AL,9
JG JP6
ADD AL,30H
JMP NEXT4
JP6:
ADD AL,37H
NEXT4:
MOV [DI],AL
INC DI
;-------------------------------------------
;最终输出
;-------------------------------------------
LEA DI,THIRD
MOV AH,02H
MOV DL,0AH
INT 21H
MOV DL,[DI+3]
MOV AH,2
INT 21H
MOV DL,[DI+2]
MOV AH,2
INT 21H
MOV DL,[DI+1]
MOV AH,2
INT 21H
MOV DL,[DI]
MOV AH,2
INT 21H
;-------------------------------------------
;返回DOS
;-------------------------------------------
MOV AH,4CH
INT 21H
CODE ENDS
END START