(汇编)输入一个十进制数字串(无符号),以四位十六进制的形式输出

来源:互联网 发布:中企动力源码下载 编辑:程序博客网 时间:2024/06/06 09:27

上汇编课,老师给我们出了一题:

输入一个十进制数字串(假定是无符号的),以四位十六进制的形式输出该串对应的值

想了一下,感觉好难,该怎么处理把字符串转换为十进制数,还有怎么把十进制数转换为十六进制,想了半天没有头

在网上搜了一下,看到了一个解法,(点击打开链接), 不过感觉有些代码略繁琐而且对一位的字符输入会有错误输出,算是一个bug,

于是忍不住进行了修改,修改了bug而且代码少了不少也清晰了很多: 


.386STACKSEGMENTUSE16STACKDB 200 DUP(0)STACK ENDSDATA SEGMENT USE16BUF1 DB  20    DB   ?    DB 20 DUP(0); buf1用来存储用户输入的字符串BUF2 DB  20    DB   ?    DB 20 DUP(30H); buf2用来存储输出的结构  每个字节默认为字符'0'INPUT DB 'Input:$'OUTPUT DB 'Output:$'CTRL DB 0DH,0AH,'$'; 提示语,换号符X1  DW  0AHX2  DW  10H  ; 进制转换用的乘法或者除法因子DATAENDSCODESEGMENTUSE16ASSUME DS: DATA, CS: CODE, SS: STACKSTART:MOVAX,DATAMOV DS,AXLEA DX,INPUTMOV AH,9INT 21H; 输出'input:'提示语LEADX,BUF1MOVAH, 10INT 21H; 把输入的存在buf1中LEADX, CTRLMOV AH, 9INT21H; 输出回车换行MOV CL, BUF1+1; cl存储输入字符个数LEA SI, BUF1+2; 输入字符首地址MOV AX, 0LOOPA:MUL [X1]MOVBL, [SI]SUB BL, 30H; ascii 码转换为数字MOVBH, 0ADD AX, BXINC SIDEC CLJNZ LOOPA; loopa 循环把输入的字符串转换为数字存到dx, ax中 dx为高字节,ax为低字节MOV CL, 0LOOPB:DIV [X2]PUSH DX;入栈INC CLMOV DX, 0CMP AX, 0JNE LOOPB; loopb 循环把十进制转换为16进制数,每一16进制位压入栈MOV AL, 4SUB AL, CLMOV AH, 0LEA SI, BUF2+2ADD SI, AXLOOPC:  POP AXCMP AX, 9JBE NUMADD AX, 7HNUM:ADD AX, 30HMOV [SI], AXINC SIDEC CLJNE LOOPC; loopc 循环把栈中的16进制数字转换为ascii码存到buf2中MOV [SI], BYTE PTR 'H'INC SIMOV [SI], BYTE PTR '$'; buf2 的结尾加上'h$'LEA DX,OUTPUTMOV AH,9INT 21H; 输出'output'提示LEADX, BUF2MOV AH, 9INT21H; 输出最终结果MOV AH, 4CHINT 21HCODEENDSEND START


0 0
原创粉丝点击