精华区代码Revision-C版本[系列三]
程序代码:
*/ ------------------------------------------------------------------------------------------- */ 出自: 编程中国 http://www.*/ 作者(也可能是转载): 爱以走远 */ 时间: 2007-9-7 */ 声明: 尊重作者劳动,转载请保留本段文字 */ 链接: http://bbs.bccn.net/viewthread.php?tid=167744&extra=page%3D2%26amp%3Bfilter%3Ddigest */ ------------------------------------------------------------------------------------------- ;Revision Declare Modified by zaixuexi ;*/ -------------------------------------------------------------------------------------- ;*/ source:http://www. ;*/ author:zaixuexi ;*/ date: 2011-11-27 ;*/ email: asmedu@ ;*/ revision declare: ;*/ 1.add self-estimated c source code ;*/ 2.adjust all asm source code upper-case style. ;*/ 3.keep all original code designment ;*/ -------------------------------------------------------------------------------------- ;typedef unsigned char uint8_t; ;typedef unsigned short int uint16_t; ;#define _BV(bit) (1 << (bit)) ;#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr)[0]) ;#define CF_OFFSET (0x01) ;#define GET_PSW (__asm lahf) ;#define RCL(a, N, n, cf_bit) \ ; do { \ ; uint8_t psw = GET_PSW; \ ; cf_bit = psw & CF_OFFSET; \ ; a = (a>>(N-n))|((a<<n) | (cf_bit<<n)); \ ; } while (0) DATA SEGMENT DAT DW 32768D,16384D,8192D,4096D,2048D,1024D,512D,256D,128D,64D,32D,16D,8D,4D,2D,1D ;uint16_t DAT[16] = {_BV(15), _BV(14), _BV(13), _BV(12), _BV(11), _BV(10),_BV(9), _BV(8), ; _BV(7), _BV(6), _BV(5), _BV(4), _BV(3), _BV(2), _BV(1), _BV(0),}; DATAW DW 2710H,03E8H,64H,0AH,0001H ;uint16_t DATAW[5] = {10000, 1000, 100, 10, 1}; TEMP DB 0 ;uint8_t TEMP = 0; TEMPDEC DW 0 ;uint16_t TEMPDEC = 0; DATA ENDS ;**********************************************; ;STACK SEGMENT STACK 'STACK' ;STA DB 50 DUP(?) ;STACK ENDS ;**********************************************; CODE SEGMENT ASSUME CS:CODE,DS:DATA ;,SS:STACK START: MOV AX,DATA MOV DS,AX LEA BX,DAT ;uint16_t *pDAT = DAT; MOV SI,0 ;uint16_t i = 0; MOV DX,0 ;uint16_t decimal = 0; MOV CX,0 ;uint16_t j = 0; CLOOP: ;do-while() CALL ENTER_BIN ;return TEMP ;ENTER_BIN(); NOPOP: CMP TEMP,1 JE YES_1 ;if (TEMP == 1) goto YES_1; CMP TEMP,0 JE YES_0 ;else if (TEMP == 0) goto YES_0; JMP EXITLOOP ;else goto EXITLOOP; YES_1: ADD CX,WORD PTR[BX] ;j |= *pDAT; better instruction: or cx, word ptr[bx] YES_0: INC BX INC BX ;pDAT++; INC SI ;i++; CMP SI,15D JBE CLOOP ;while (i <= ARRAY_SIZE(DAT)); EXITLOOP: MOV DX,CX ;decimal = j; INC SI ;i++; MOV CX,SI ;j = i; RCL DX,CL ;uint8_t cf_bit; RCL(decimal, sizeof(decimal), (LOBYTE)j, cf_bit); CALL CR_LF ;printf("\r\n"); CALL PRINT_DEC ;DX enter to PRINT_DEC or PRINT_HEX ;PRINT_DEC(decimal); CALL CR_LF ;printf("\r\n"); EXIT: MOV AX,4C00H INT 21H ;exit(0); ;-------------------------------------------------; ENTER_BIN PROC NEAR ;return TEMP MOV AH,01H INT 21H ;uint8_t ch = getchar(); SUB AL,30H MOV TEMP,AL ;TEMP = ch - 0x30; RET ;return; ENTER_BIN ENDP ;-------------------------------------------------; ;PRINT_HEX PROC NEAR ;DX enter to PRINT_DEC or PRINT_HEX ;PRINT_HEX ENDP ;-------------------------------------------------; PRINT_DEC PROC NEAR ;DX enter to PRINT_DEC or PRINT_HEX MOV AX,DX ;uint16_t decimal = decimal; LEA BX,DATAW ;uint16_t *pDATAW = DATAW; MOV SI,0 ;uint16_t i = 0; MOV CX,05H ;uint16_t j = 5; PLOOP: XOR DX,DX ;uint16_t k = 0; DIV WORD PTR [BX+SI] ;decimal /= pDATAW[i]; ADD AX,30H ;get ASCII XCHG AX,DX MOV TEMPDEC,AX ;TEMPDEC = decimal % pDATAW[i]; k = (decimal/pDATAW[i] + 0x30); MOV AH,02H INT 21H ;putchar(LOBYTE(k)); MOV AX,TEMPDEC ;decimal = TEMPDEC; INC SI INC SI ;i += 1*sizeof(uint16_t) / sizeof(uint16_t); LOOP PLOOP ;while (j--); RET PRINT_DEC ENDP ;-------------------------------------------------; CR_LF PROC NEAR MOV TEMP, DL ;better instruction: push dx MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H MOV DL,TEMP ;pop dx RET CR_LF ENDP ;-------------------------------------------------; CODE ENDS END START简单评论: 代码描述比较清晰