· 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
Be careful how you get yourself involved with persons or situations that can't bear inspection.


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.0046 sec