· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
¼ýÀÚ¸¦ ¹®ÀÚ¿­·Î º¯È¯ÇÏ´Â ¹æ¹ý

¼ýÀÚ¸¦ ¹®ÀÚ¿­·Î º¯È¯ÇÏ´Â ¹æ¹ý

  • ÀÛ¼ºÀÚ
    Á¶ÀçÇõ(Mminzkn@minzkn.com)

  • °íÄ£°úÁ¤
    2005³â 4¿ù 23ÀÏ : óÀ½¾¸
    2006³â 6¿ù 18ÀÏ : ¼³¸íÃß°¡

°³¿ä

¾î¼Àºí¸®(Assembly) ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ù°¡ º¸¸é Register ¶Ç´Â Memory¿¡ ÀúÀåµÈ ¾î¶² °á°ú°ªÀ» È­¸é¿¡ Ç¥½ÃÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. À̶§ ÀúÀåµÈ °á°ú°ªÀ» °¢ Áø¹ý¿¡ ¸Â´Â ÀÚ¸´¼ö ´ÜÀ§·Î ¹®ÀÚÈ­ÇÏ´Â º¯È¯ÀÌ ÇÊ¿äÇÏ´Ù.

Áï, 1234¶ó´Â 10Áø¼öÀÇ °á°ú°ªÀÌ ÀúÀåµÇ¾î ÀÖÀ»¶§ È­¸é¿¡ 10Áø¼ö·Î Ãâ·ÂÇϱâ À§Çؼ­´Â 1, 2, 3, 4·Î ÀÚ¸´¼ö·Î ºÐ¸®ÇÏ°í È­¸é¿¡ Ãâ·ÂÇϱâ À§ÇÑ Ascii°ªÀ¸·Î º¯È¯ÇÏ´Â °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù.

À̶§ ¼ýÀÚ 0Àº Ascii 16Áø¼ö°ªÀ¸·Î 30H¿¡ ÇØ´çÇÏ°í 1Àº 31H, ... 9´Â 39H°¡ µÈ´Ù. Áï, ºÐ¸®µÈ 1, 2, 3, 4¸¦ È­¸é¿¡ Ãâ·ÂÇÏ·Á¸é 31H, 32H, 33H, 34H ·Î Ãâ·ÂÀ» ÇØ¾ß ÇÑ´Ù´Â ÀǹÌÀÌ´Ù.

ÀÌ·Ð

°¢ ÀÚ¸´¼ö¸¦ ºÐ¸®ÇÏ·Á¸é ¾î¶»°Ô ÇÏ¸é µÉ±î? ¾î¶°ÇÑ °ª x°¡ ÀÖÀ»¶§ ÀÌ°ÍÀ» zÁø¹ýÀ¸·Î ÀÚ¸´¼ö¸¦ ºÐ¸®ÇÏ·Á¸é y = x % z ¿Í °°ÀÌ ³ª¸ÓÁö¸¦ ÃëÇÏ¿© °¡Àå ³·Àº ÀÚ¸´¼ö¸¦ ±¸ÇÒ¼ö ÀÖ´Ù. ±×¸®°í ´ÙÀ½ÀÚ¸´¼ö¸¦ ±¸Çϱâ À§Çؼ­ x = x / z(½Ç¼ö³ª´°¼ÀÀÌ ¾Æ´Ï°í Á¤¼ö³ª´°¼ÀÀ¸·Î ¼Ò¼ýÁ¡Àº ¹ö¸°´Ù)À¸·Î ¹æ±Ý ±¸Çß´ø °¡Àå ³·Àº ÀÚ¸´¼ö¸¦ ¶³±Å¹ö¸±¼ö ÀÖ´Ù. ÀÌ¿Í °°Àº ¹æ¹ýÀ» ¹Ýº¹ÇÏ¿© x°¡ 0ÀÌ µÉ¶§±îÁö ¹Ýº¹ÇÏ¸é °¢ ÀÚ¸´¼ö°¡ Çϳª¾¿ »Ì¾ÆÁ® ³ª¿À°Ô µÇ´Â°ÍÀÌ´Ù.

Á¶±Ý ÀÀ¿ëÇÏ¿© ¿¹¸¦ µé¾îº¸ÀÚ. ¸¸¾à 10Áø¼ö·Î 5¶ó´Â ¼ýÀÚ°¡ ÀÖ´Ù. ÀÌ°ÍÀ» 2Áø¹ýÀ¸·Î ÀÚ¸´¼ö¸¦ ºÐ¸®ÇÏ·Á¸é ¾î¶»°Ô ÇÒ±î? ¸ÕÀú y = 1 = 5 % 2ÀÌ´Ù. ÀÌ°ÍÀÌ °¡Àå ³·Àº ÀÚ¸´¼ö°¡ µÈ´Ù. ±×¸®°í x = 2 = 5 / 2°¡ ´ÙÀ½ °è»êÇÒ °ªÀÌ µÈ´Ù. ÀÌÁ¦ ´Ù½Ã y = 0 = 2 % 2 ¿Í °°ÀÌ ¹Ø¿¡¼­ µÎ¹ø° ÀÚ¸´¼ö°¡ µÈ´Ù. ´Ù½Ã x = 1 = 2 / 2ÀÌ µÇ°í y = 1 = 1 % 2¿Í °°ÀÌ ¹Ø¿¡¼­ ¼¼¹ø° ÀÚ¸´¼ö°¡ µÈ´Ù. ´Ù½Ã x = 0 = 1 / 2°¡ µÇ¾î 0ÀÌ µÇ¹Ç·Î ³¡ÀÌ ³­´Ù. °á±¹ 1, 0, 1·Î ÀÚ¸´¼ö°¡ ºÐ¸®µÇ¸ç À̸¦ Ascii·Î °¢ ÀÚ¸´¼ö¸¦ º¯È¯Çϸé 31H, 30H, 31H°¡ µÇ°Ô µÈ´Ù.

ÀÌ°ÍÀ» C¾ð¾î·Î Ç¥ÇöÇÏ¸é °£´ÜÈ÷ ´ÙÀ½°ú °°Àº ªÀº ÇÔ¼ö°¡ ÀÛ¼ºµÉ¼ö ÀÖ´Ù.
char * int_to_string(unsigned int s_value /* º¯È¯ÇÏ°íÀÚ ÇÏ´Â °ªÀ» ÀԷ¹޴´٠*/, int s_radix /* ¿øÇÏ´Â Áø¹ý¼ö ÀԷ¹޴´٠*/)
{
    /* ¹è¿­À» È°¿ëÇÏ¿© 0¹ø° À妽º´Â 30H°¡ µÇ´Â ½ÄÀ¸·Î ÀÚ¸´¼ö¸¦ Ascii·Î º¯È¯ÇÏ´Â Å×À̺íÀ» ¼±¾ðÇÑ´Ù. */
    static const char c_base_ascii[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 'A', 'B', 'C', 'D', 'E', 'F'};
    /* C¾ð¾î¿¡¼­ ¹®ÀÚ¿­À» ¹ÝȯÇϱâ À§Çؼ­ static ¸Þ¸ð¸® °ø°£ÀÌ ÇÊ¿äÇÏ´Ù. ÇÏÁö¸¸ Thread»óȲ¿¡¼­ »ç¿ëÇÒ°ÍÀ̶ó¸é mallocÀ¸·Î ÇÒ´çÇÏ¿© ¹ÝȯÇØ¾ß ÇÑ´Ù. ¿©±â¼­´Â ´ÜÁö ¿¹Á¦¸¦ º¸À̱â À§ÇØ °£´ÜÇÏ°Ô staticÀ» Àâ¾ÒÀ»»ÓÀÌ´Ù. ¾Æ·¡¿¡¼­ buffer¸¦ ¾î¶»°Ô ¹ÝȯÇÏ´ÂÁö °¢ÀÚ À¯½ÉÈ÷ º¸±â¸¦ ¹Ù¶õ´Ù */
    static char s_buffer[ 64 ] = {0, };
    /* bufferÀÇ ³¡À» °¡¸£Å°´Â°ÍÀ¸·Î offsetÀ» ½ÃÀÛÇÑ´Ù. */
    size_t s_offset = sizeof(s_buffer) - 1;

    do {
        s_buffer[--s_offset] = c_base_ascii[ s_value % s_radix /* y = x % z */ ];
        s_value /= s_radix; /* x = x / z */
    }while(s_value != 0u); /* °ªÀÌ 0ÀÌ µÉ¶§±îÁö ¹Ýº¹ */

    return((char *)(&s_buffer[s_offset]));
}


¿¹Á¦

  • C¾ð¾î ¿¹Á¦
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char * int_to_string(unsigned int s_value, int s_radix)
    {
        static const char c_base_ascii[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        static char s_buffer[ 64 ] = {0, };
        size_t s_offset = sizeof(s_buffer) - 1;
    
        do {
            s_buffer[--s_offset] = c_base_ascii[ s_value % s_radix ];
            s_value /= s_radix;
        }while(s_value != 0u);
    
        return((char *)(&s_buffer[s_offset]));
    }
    
    void test(unsigned int s_value)
    {
        char s_base2[64];
        char s_base8[64];
        char s_base10[64];
        char s_base16[64];
    
        (void)strcpy((char *)(&s_base2[0]), (const char *)int_to_string(s_value, 2));
        (void)strcpy((char *)(&s_base8[0]), (const char *)int_to_string(s_value, 8));
        (void)strcpy((char *)(&s_base10[0]), (const char *)int_to_string(s_value, 10));
        (void)strcpy((char *)(&s_base16[0]), (const char *)int_to_string(s_value, 16));
    
        (void)fprintf(stdout, "%d = \"%sb/%so/%sd/%sh\"\n",
            s_value,
            (char *)(&s_base2[0]),
            (char *)(&s_base8[0]),
            (char *)(&s_base10[0]),
            (char *)(&s_base16[0]));
    }
    
    int main(void)
    {
        test(12345678);
    
        return(EXIT_SUCCESS);
    }
    


  • ¾î¼Àºí¸® ¿¹Á¦ (MASM)
    ; ÀÌ ÇÔ¼ö´Â AX°ªÀ» ¹®ÀÚ¿­·Î Ãâ·ÂÇÏ°í Ãʱâ BX°ªÀ» ¹Ù²Ù¸é ±×¿¡ ÇØ´çÇÏ´Â Áø¼öÇ¥±â¹ýÀ¸·Î ¹Ù²ñ
    P_PRINT_BIN     PROC NEAR ; void near pascal P_PRINT_BIN(AX)
                    MOV BX, 16 ; 16Áø¼ö Ãâ·Â (¿©±â¸¦ ¹Ù²Ù¸é Áø¼öÇ¥±â¹ýÀÌ ¹Ù²ñ 2´Â 2Áø¹ý, 4´Â 4Áø¹ý, 8Àº 8Áø¹ý, ...)
                    XOR CX, CX
    L_PRINT_BIN_0:
                    XOR DX, DX
                    DIV BX
                    CMP DX, 10
                    JL L_PRINT_BIN_LESS_0
                    SUB DX, 10
                    ADD DX, 'A'
                    JMP L_PRINT_BIN_LESS_1
    L_PRINT_BIN_LESS_0:
                    ADD DX, '0'
    L_PRINT_BIN_LESS_1:
                    PUSH DX
                    INC CX
                    OR AX, AX
                    JNZ L_PRINT_BIN_0
    
    ;                PUSH CX
    ;                MOV AX, CX
    ;                MOV CX, 8
    ;                SUB CX, AX
    ;L_PRINT_BIN_ZERO_0:
    ;                JCXZ L_PRINT_BIN_ZERO_1
    ;                DEC CX
    ;                MOV AH, 02H
    ;                MOV DL, '0'
    ;                INT 21H 
    ;                JMP SHORT L_PRINT_BIN_ZERO_0
    ;L_PRINT_BIN_ZERO_1:
    ;                POP CX
    
    
    L_PRINT_BIN_1:
                    POP DX
                    MOV AH, 02H
                    INT 21H
                    LOOP L_PRINT_BIN_1
                    RETN
    P_PRINT_BIN     ENDP
    



ID
Password
Join
Far duller than a serpent's tooth it is to spend a quiet youth.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-06-25 15:49:12
Processing time 0.0048 sec