#title ¼ýÀÚ¸¦ ¹®ÀÚ¿­·Î º¯È¯ÇÏ´Â ¹æ¹ý == ¼ýÀÚ¸¦ ¹®ÀÚ¿­·Î º¯È¯ÇÏ´Â ¹æ¹ý == * ÀÛ¼ºÀÚ Á¶ÀçÇõ([mailto:minzkn@minzkn.com]) * °íÄ£°úÁ¤ 2005³â 4¿ù 23ÀÏ : óÀ½¾¸[[BR]] 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 #include #include 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 }}}