在以ASCBUF为首址的内存中存放4个字节ASCII码 试编写程序将其转换成两字节4位十六进制数 存在HEX
-
正确答案:源程序: DATA SEGMENT ASCBUF DB"4E5DH" HEXBUF DW? DATA ENDS STACK SEGMENT PARA STACK "STACK" STA DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODEDS:DATASS:STACK ATOH PROC FAR START: PUSH DS XOR AX.AX PUSH AX MOV AX.DATA MOV DS.AX MOV AX.STACK MOV SS.AX MOV CH.4 MOV SIOFFSET ASCBUF ;十六进制数ASCII码首址送SI XOR BX.BX MOV AH.0 NEXT: MOV AL[SI] ;取一位ASCⅡ码 SUB AL30H ;转换成4位二进制数 CMP AL10 ;判断是否在"0"~"9"间 JB NEXT1 :若是转NEXT1 SUB AL7 ;若不是则转换成"A"~"F" OR AXBX ;归并成4位十六进制数 NEXT1: MOV CL.4 ROR AX.CL MOV BX.AX INC SI ;修改取数地址 DEC CH JNZ NEXT MOV HEXBUFAX ;转换好的16位二进制数送 ;HEXBUF RET ATOH: ENDP CODE ENDS END START
源程序:DATASEGMENTASCBUFDB"4E5DH"HEXBUFDW?DATAENDSSTACKSEGMENTPARASTACK"STACK"STADB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKATOHPROCFARSTART:PUSHDSXORAX.AXPUSHAXMOVAX.DATAMOVDS.AXMOVAX.STACKMOVSS.AXMOVCH.4MOVSI,OFFSETASCBUF;十六进制数ASCII码首址送SIXORBX.BXMOVAH.0NEXT:MOVAL,[SI];取一位ASCⅡ码SUBAL,30H;转换成4位二进制数CMPAL,10;判断是否在"0"~"9"间JBNEXT1:若是转NEXT1SUBAL,7;若不是则转换成"A"~"F"ORAX,BX;归并成4位十六进制数NEXT1:MOVCL.4RORAX.CLMOVBX.AXINCSI;修改取数地址DECCHJNZNEXTMOVHEXBUF,AX;转换好的16位二进制数送;HEXBUFRETATOH:ENDPCODEENDSENDSTART
