十六进制转十进制
DATAS SEGMENT DBUF DW 3039H;16进制数3039H为10进制数12345 DVAL DB 5 DUP(?);申请缓冲区,存放转换后的数据 DLEN =$-DBUF ;地址偏移量 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV SI,OFFSET DBUF;数据源地址 MOV DX,[SI];DX赋值3090H MOV SI,OFFSET DLEN;目标数据地址 offset送回偏移地址 A1: DEC SI;自减 MOV AX,DX MOV DX,0 MOV CX,10;除数10 DIV CX;商送AX,余数DX XCHG AX,DX;数据交换 MOV [SI],AL;存入目标地址 ; MOV BX,DX ; ADD AL,30H ; MOV DL,AL ;输出54321 ; MOV AH,2 ; INT 21H ; MOV DX,BX CMP DX,0000H JNE A1;判断转换结束否,未结束转A1 不等跳转 A2: CMP SI,OFFSET DVAL;与目标地址的首址比较 JZ A3;等于首地址转A3,否则将剩余地址填00H 等0跳转 DEC SI MOV AL,00H MOV [SI],AL JMP A2 A3: MOV CX,5 ;循环次数 MOV SI,OFFSET DVAL;目标数据地址 offset送回偏移地址 MLOOP: MOV AL,[SI];将SI地址的数依次赋值给AL INC SI ADD AL,30h ;ascii码 MOV DL,AL ;输出 MOV AH,2 INT 21H LOOP MLOOP ;循环 MOV AH,4CH INT 21H CODES ENDS ENDSTART十进制转十六进制
DATAS SEGMENT NUMS DB 6 DUP(?);3,2,7,6,7 ;十进制数:32767 每个占一个字节 NUMO DB 4 DUP(?) DLEN=$-NUMS DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV SI,OFFSET NUMS ;源数据地址 NLOOP: ;循环输入 MOV AH,1 INT 21H CMP AL,'9';ascii码>9输入结束 JA L1 SUB AL,48 MOV [SI],AL INC SI JMP NLOOP L1: MOV AH,2 MOV DL,10 INT 21H ;换行 SUB SI,1 ;现在SI是结束符地址 -1才是数字尾号位地址 MOV CX,SI MOV SI,OFFSET NUMS ;源数据地址 MOV BX,10 ;被乘数 MOV DH,0 ;屏蔽源数据高8位 MOV AH,0 MOV AL,[SI] ;取首个数据 A0: IMUL BX ;乘10 MOV DL,[SI+1] ;取当前数据 ADC AX,DX ;源数据累加 INC SI ;源地址增量 CMP SI,CX ;判断是否累加完毕 JB A0 MOV DX,AX MOV SI,OFFSET DLEN ;缓冲区结束后一位地址 A1: DEC SI ;NUMO的最后一位地址 MOV AX,DX MOV DX,0 MOV CX,16;除数16 DIV CX;商送AX,余数DX XCHG AX,DX;数据交换 MOV [SI],AL;存入目标地址 CMP DX,0000H JNE A1;判断转换结束否,未结束转A1 不等跳转 A2: CMP SI,OFFSET NUMO;与目标地址的首址比较 JZ A3;等于首地址转A3,否则将剩余地址填00H 等0跳转 DEC SI MOV AL,00H MOV [SI],AL JMP A2 A3: MOV CX,4 ;循环次数 MLOOP: MOV AL,[SI];将SI地址的数依次赋值给AL INC SI CMP AL,9 JA A4 ADD AL,30H ;ascii码 MOV DL,AL ;输出0-9 MOV AH,2 INT 21H JMP A5 A4: ADD AL,37H ;ascii码 MOV DL,AL ;输出ABCDEF MOV AH,2 INT 21H A5: LOOP MLOOP ;循环 MOV AH,4CH INT 21H CODES ENDS END START另一种输入方法(MOV AH,0AH)
DATAS SEGMENT NUMS DB 8 db 0 db 6 DUP(?) NUMO DB 4 DUP(?) DLEN=$-NUMS DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV DX,OFFSET NUMS ;源数据地址 就得用DX MOV SI,DX MOV AH,0AH INT 21H ;输入字符串 MOV CX,0 ;计数 ADD SI,1 MOV BX,[SI];字符数量 输入12345+回车是5 MOV BH,0 ADD SI,1 L1: MOV AL,[SI] SUB AL,48 MOV [SI],AL INC SI INC CX CMP CX,BX ;ASCII码转数据存入SI JB L1 MOV CX,BX MOV AH,2 INC CX ;现在CX值为字符串尾地址 MOV DL,10 INT 21H MOV SI,OFFSET NUMS ;源数据地址 ADD SI,2 ;第一个字符的地址 MOV BX,10 ;被乘数 MOV DH,0 ;屏蔽源数据高8位 MOV AH,0 MOV AL,[SI] ;取首个数据 A0: IMUL BX ;乘10 MOV DL,[SI+1] ;取当前数据 ADC AX,DX ;源数据累加 INC SI ;源地址增量 CMP SI,CX JB A0 MOV DX,AX MOV SI,OFFSET DLEN A1: DEC SI MOV AX,DX MOV DX,0 MOV CX,16;除数16 DIV CX;商送AX,余数DX XCHG AX,DX;数据交换 MOV [SI],AL;存入目标地址 CMP DX,0000H JNE A1;判断转换结束否,未结束转A1 不等跳转 A2: CMP SI,OFFSET NUMO ;与目标地址的首址比较 JZ A3;等于首地址转A3,否则将剩余地址填00H 等0跳转 DEC SI MOV AL,00H MOV [SI],AL JMP A2 A3: MOV CX,4 ;循环次数 MLOOP: MOV AL,[SI];将SI地址的数依次赋值给AL INC SI CMP AL,9 JA A4 ADD AL,30H ;ascii码 MOV DL,AL ;输出0-9 MOV AH,2 INT 21H JMP A5 A4: ADD AL,37H ;ascii码 MOV DL,AL ;输出ABCDEF MOV AH,2 INT 21H A5: LOOP MLOOP ;循环 MOV AH,4CH INT 21H CODES ENDS END START0AH号DOS功能调用要求按如下安排数据缓冲区。 1.缓冲区第1字节事先填入最多要接收的字符个数 在执行该调用时输入字符的实际个数将存放在该缓冲区的第2字节(不包括回车符),所以定义时第2个字节位置可以任意(存放0当然可以)
NUMS DB 8 ;最多输入7个字符+回车 db 0 ;存放输入的实际个数 输入32767,则这为5 db 6 DUP(?) ; 存储字符串的缓冲区AND 输入数据其实是输入的ASCII码,如果进行运算要先减去48!!