Win32 MASM ÇÁ·Î±×·¡¹Ö ¼Ò°³(Visual C++ÀÌ¿ë)
Written by ±ÇÇÊÁø. 06'08 - aka Xeno
Chapter 1 ¡¡ Áغñ»çÇ×
°³¿ä : Win32 ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇϱâ Àü¿¡
MASM ÇÁ·Î±×·¡¹ÖÀ» Çϱâ Àü¿¡, ¸ðµç Ã¥ÀÓÀº ÀÚ½ÅÀÌ Áø´Ù´Â °ÍÀ» ¸í½ÉÇϱ⠹ٶõ´Ù. MASMÀº ·Î¿ì·¹º§ÀÇ ¸í·É¾î¸¦ ½ÇÇàÇÒ ¼ö Àֱ⠶§¹®¿¡, ¹ö±×°¡ ¹ß»ýÇßÀ» °æ¿ì ÄÄÇ»ÅÍ¿¡ Ä¡¸íÀûÀÎ ¿¡·¯ ȤÀº PCÀÚü°¡ ÀÛµ¿ÇÏÁö ¾Ê´ÂÀϵµ ÀÖÀ» ¼öµµ ÀÖ´Ù. ±×·¯¹Ç·Î,
ÀÌ ¹®¼·Î ÀÎÇÏ¿© ¹ß»ýÇÑ ¼ÕÇØ ¹× ¹®Á¦´Â ÇÊÀÚ°¡ ¾î¶°ÇÑ Ã¥ÀÓ°ú º¸»óµµ ÁöÁö ¾ÊÀ½À» ¼÷ÁöÇÏ°í Àо°¡±â ¹Ù¶õ´Ù.
(³Ê¹« °Ì¸ÔÀ»ÇÊ¿ä´Â ¾ø´Ù)
ÁÖÀÇ£ºÀÌ ¹®¼´Â 2006³â°æ¿¡ ÀÛ¼º Çß´Ù. Å×½ºÆ® ȯ°æÀ¸·Î¼´Â WindowsXP-SP2ȯ°æÀ¸·Î Å×½ºÆ®Çß´Ù. º» ¹®¼´Â ¼ö½Ã·Î º¯°æ µÉ ¼öµµ ÀÖ´Ù.
MASM À̶õ, ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®»çÀÇ ¾î¼Àºí·¯ ÅøÀÌ´Ù. ÇöÀç´Â ¹«»óÀ¸·Î Á¦°øµÇ±â ¶§¹®¿¡, ¾î¼Àºí·¯°øºÎ¸¦ ÇÏ°í ½Í´Ù¸é Áö±ÝÀÌ ÃÖÀûÀÇ ½Ã±âÀÌ´Ù. ¾î¼Àºí¸®¸¦ ÀÍÈ÷°Ô µÈ´Ù¸é ÄÄÇ»ÅÍ¿¡ ´ëÇØ Áö±Ý±îÁö ¸ô¶ú´ø °ÍÀ» ¾Ë ¼öÀÖ°Ô µÉÁöµµ ¸ð¸¥´Ù. ÇÏÁö¸¸, MASMÀ» ¼³¸íÇÏ´Â °÷Àº µå¹É°í ÀÚ·á¶ÇÇÑ °ÅÀÇ ¾ø±â ¶§¹®¿¡ ÀÌ·¸°Ô ¹®¼¸¦ ÀÛ¼ºÇÏ°í ÀÖ´Â °ÍÀÌ´Ù. ¶ÇÇÑ, º» ¹®¼´Â °£´ÜÇÑ ¼Ò°³Á¤µµ¿¡ ±×Ä¡´Â ¼öÁØÀ̸ç Á»´õ ÀÚ¼¼ÇÑ ³»¿ëÀº ÃßÈÄ·Î ¹Ì·ç´Â °Í ¶ÇÇÑ ¾Ë¾ÆµÎ±â ¹Ù¶õ´Ù.
±×·¸´Ù¸é ¸ÕÀú, MASMÀ» ±¸ÇØ¾ß ÇÑ´Ù. ÀÌ¹Ì ¸»ÇßµíÀÌ, ÇöÀç´Â ¹«»óÀ¸·Î Á¦°øµÇ±â ¶§¹®¿¡, ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ È¨ÆäÀÌÁö¿¡¼ ´Ù¿î·Îµå ÇÑ´Ù. ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ DDK (Driver Development Kit) ¶ó´Â ÆÐÅ°Áö ¾È¿¡ Æ÷ÇԵǾîÀÖ´Ù. DDK ´Â, 20¸Þ°¡ ÀÌ»óÀÇ Å©±âÀÏ°ÍÀ̹ǷΠ´Ù¿î·ÎµåÇϴµ¥ ½Ã°£ÀÌ °É¸±Áöµµ ¸ð¸¥´Ù.
Âü°í·Î, DDK ¿¡ µé¾îÀÖ´Â MASMÀº ¹öÁ¯ÀÌ ³·°í MMX¸í·É¾î¸¦ ÀνÄÇÏÁö ¸øÇϱ⠶§¹®¿¡, °ÁÂ¿Í ¹öÁ¯À» ¸ÂÃâ·Á¸é ¡¸ÆÐÄ¡¡¹¸¦ ÇØÁÖ¾î¾ß ÇÑ´Ù. ÆÐÄ¡ ¶ÇÇÑ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ È¨ÆäÀÌÁö¿¡¼ ±¸ÇÒ ¼ö°¡ ÀÖ°í, ´Ù¿î·ÎµåÇÑ ÈÄ ¾ÐÃàÀ» ÇØÁ¦ÇÏ°í , ÆÄÀϵéÀ» ¸ðµÎ MASMÀÌ ÀÖ´Â µð·ºÅ丮¾È¿¡ º¹»ç ÇÑ ÈÄ¡¸ÆÐÄ¡¡¹½ÇÇà ÆÄÀÏÀ» ½ÇÇàÇÑ´Ù.
MASM ÀÇ ¹öÁ¯ÀÌ ÃֽŻóÅ·ΠµÇ¾ú´Ù¸é, VC++ ¿¡¼ MASM¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¼³Á¤ÇÑ´Ù. ÀÌ·¸°Ô Çϸé VCȯ°æ¿¡¼ ¾î¼Àºí¸®È¯°æÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ°Ô µÇ¹Ç·Î, ¿©·¯°¡Áö Æí¸®ÇÑ Á¡ÀÌ ÀÖ´Ù.
°¡Àå ¸ÕÀú ÇؾßÇÏ´Â °ÍÀº, MASM ¸¦ ±¸ÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀº ¾Æ·¡ÀÇ Àå¼Ò¿¡¼ ±¸ÇÒ ¼ö°¡ ÀÖ´Ù.
»ó±â¿¡¼ ¼³¸íÇßµíÀÌ MASMÀ» ±¸ÇÏ°í ÆÐÄ¡¸¦ ÇؾßÇÏÁö¸¸ ¹ø°Å·Ó´Ù. ÀÌ·²°æ¿ì VC¿ë ÆÐÅ°Áö°¡ Á¸ÀçÇÑ´Ù. º» °Á¿¡¼´Â
À̹æ¹ýÀ» »ç¿ëÇϱâ·Î ÇÑ´Ù.
Visual C++ 6.0 ¿¡ MASM¸¦ Ãß°¡ÇÏ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº, ProcessorPack ÀÇ Ãß°¡ÀÌ´Ù. ÀÌ¹Ì ML¹öÀüÀÌ 6.15°¡ Æ÷ÇԵǾî Àֱ⠶§¹®¿¡, ÆÐÄ¡ ´Ü°è°¡ ÇÊ¿ä¾ø´Ù. ÇÏÁö¸¸, ÆÐÅ°Áö°¡ SP4 ,SP5 Àü¿ëÀ̱⠶§¹®¿¡, SP6 À» ¼³Ä¡Çß´Ù¸é, /C ¿É¼ÇÀ» »ç¿ëÇؼ ¾ÐÃàÀ» ÇØÁ¦ÇÑ ÈÄ Á÷Á¢ ¼³Ä¡ÇØ ÁÖ¾î¾ßÇÑ´Ù. Âü°í·Î VisualStudio.NET ÀÌ»ó ¹öÀü¿¡´Â ML.EXE ´Â Ãß°¡ÇØ ÁÖÁö¾Ê¾Æµµ ÀÌ¹Ì Æ÷ÇÔ µÇ¾îÀÖ´Ù. 2002 ´Â ¹öÀü 7.00 À̸ç, 2003¿¡´Â 7.10 ÀÌ Æ÷ÇÔ µÇ¾î ÀÖ´Ù. ¾Æ·¡ÀÇ ÁÖ¼Ò¿¡¼ ProcessorPackÀ» ´Ù¿î·Îµå ÇÒ ¼öÀÖ´Ù.
http://msdn.microsoft.com/vstudio/downloads/tools/ppack/default.aspx ¿¡¼ "Download Now" ºÎºÐÀ» Ŭ¸¯ÇÑ´Ù. ȤÀº http://download.microsoft.com/download/vb60ent/update/6/w9x2kxp/en-us/vcpp5.exe ¸µÅ©¸¦ Ŭ¸¯Çؼ ´Ù¿î ¹ÞÀº ÈÄ vcpp5.exe / c ¿É¼ÇÀ¸·Î ¾ÐÃàÀ» ÇØÁ¦Çصµ µÈ´Ù. WinZip°ú °°Àº ¾ÐÃà ÇÁ·Î±×·¥À¸·Îµµ ¾ÐÃàÀ» ÇØÁ¦ÇÒ ¼öÀÖ´Ù.
¾ÐÃàÇØÁ¦ÇÑ ÈÄ ÇØ´ç Æú´õ¸¦ VCÀÇ ¼³Ä¡ Æú´õ¿¡ Åë°·Î º¹»çÇØÁØ ÈÄ ¾Æ·¡ÀÇ ¼ø¼´ë·Î °æ·Î¸¦ Àâ¾ÆÁÖ¸é µÈ´Ù.
MASM¸¦ ±¸Çߴ°¡? MASMÀÇ ÇÁ·Î±×·¥ ÆÄÀϸíÀº ML.EXE ¶ó´Â À̸§ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¼Ò½ºÆÄÀÏÀ» ¾î¼Àºí¸µ ÇØÁÖ°í ¸µÅ©±îÁö ÇØÁÖ°Ô µÇ¸ç,¿øÇÑ´Ù¸é, ¿ÀºêÁ§Æ®ÆÄÀϸ¸ »ý¼ºÇØ ÁÙ ¼öµµ ÀÖ´Ù.(16bit¸µÄ¿»ç¿ë½Ã)
Ãß°¡·Î, º»°Á¿¡ »ç¿ëµÇ´Â Microsof Visual C++ 6.0Àº Á¦°øÇØ ÁÙ ¼ö°¡ ¾ø´Ù. °¢ÀÚ ±¸Çϱ⠹ٶõ´Ù.(-_-)
»ç¿ëµÈ ¼Ò½º´Â º¹»çÇؼ ºÙ¿©³Ö±â¸¦ ¼öÇàÇصµ ÀÛµ¿Çϵµ·Ï µÇ¾îÀÖÀ¸¸ç, ÅؽºÆ®ºä¾î´Â ¼Ò½ºÆÄÀÏÀÇ ¸µÅ©¸¦ Ŭ¸¯Çؼ
ÇØ´ç .dswÆÄÀÏÀ» ¿¾î¼ F5Å°¸¦ ´·¯¼ ½ÇÇàÇÏ¸é µÈ´Ù.
Chapter 1 - 3 ¡¡ VC++¿¡¼ MASMÀ» »ç¿ëÇϵµ·Ï ¼³Á¤
ÀÌÁ¦ºÎÅÍ´Â, MASM¸¦ VC++¿¡¼ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çغ¸ÀÚ. MASMÀ» VC++ ¿¡¼ »ç¿ëÇÒ·Á¸é, VC++ÀÇ ¡¸Ä¿½ºÅÒ ºôµå¡¹¶ó´Â ±â´ÉÀ» »ç¿ëÇؾßÇÑ´Ù.
¸ÕÀú File -> New ¸¦ ¼±ÅÃÇؼ Win32 ApplicationÀ» ¼±ÅÃÇÑ ÈÄ "An Empty Project"¸¦ ¼±ÅÃÇÑ ÈÄ ´Ù½Ã File->New¸¦
¼±ÅÃÇؼ Text FileÀ» ¼±ÅÃÇÏ°í ÆÄÀϸíÀ» "VCMASM.ASM"À̶ó°í Á¤ÇØÁÖ°í ¾Æ·¡ÀÇ ³»¿ëÀ» ¼öÇàÇØ º¸±â ¹Ù¶õ´Ù.
VC++¿¡¼ ML.EXE ¸¦ ½ÇÇàÇØ¾ß ÇϹǷÎ, ½ÇÇàÆÄÀÏ °æ·Î¸¦ ¼³Á¤ÇØÁÖ¾î¾ß ÇÑ´Ù. ¡¸Tools¡¹-> ¡¸Options¡¹À» ¼±ÅÃÇÏ°í ¾Æ·¡¿Í °°ÀÌ ¼³Á¤ÇÑ´Ù.
¡¸Directories¡¹ÅÇÀ¸·Î À̵¿ÈÄ¿¡ ¹Ýµå½Ã ¡¸Executable Files¡¹¸¦ ¼±ÅÃÇϱ⠹ٶõ´Ù. Ãß°¡ ¹öÆ°À» ´·¯¼ ¾ÐÃàÇØÁ¦ÇÑ Æú´õ¸¦ ÁöÁ¤ÇØÁØ´Ù. Âü°í·Î, °¡Àå ÇÏ´Ü¿¡ Ãß°¡Çϱ⠹ٶõ´Ù. º» °Á¿¡¼´Â C:\VC60\VCPP5 ¶ó´Â Æú´õÀÌ´Ù.
ÀÌÁ¦ ½ÇÁ¦·Î °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ.
File -> New·Î, Win32 application ÀÇ ½ÃÀÛ ÇÁ·ÎÁ§Æ®¸¦ ÀÛ¼ºÇÑ´Ù. ±×·± ´ÙÀ½¿¡, MASMÀÇ ¼Ò½ºÄڵ带 ÀÛ¼ºÇÕ´Ï´Ù. ÀÌ°ÍÀº File -> New -> FilesÅÇ¿¡¼, È®ÀåÀÚ(extension)°¡ ASM ÀÌ µÇ°Ô²û ÇÏ°í ½Å±ÔÆÄÀÏÀ» ÀÛ¼ºÇÑ´Ù.
±×·± ´ÙÀ½, Ä¿½ºÅÒ ºôµåÀÇ ¼³Á¤À» ÇÑ´Ù. Project -> SettingÀ» ¼±ÅÃÇÏ°í, ¾î¼Àºí¸® ¼Ò½º ÆÄÀÏÀ» ¼±ÅÃÇÑ´Ù. Ä¿½ºÅÒ ºôµå ÅÇÀ» ¼±ÅÃÇÑ ÈÄ, ¾Æ·¡¿Í °°ÀÌ ¼³Á¤ÇÑ´Ù.
Commands ÅؽºÆ® ¹Ú½º¿¡´Â,
ml /c /coff /Cx /nologo /Fo$(OutDir)\ /Fl$(InputName) /Zi $(InputPath)
·Î ¼³Á¤ÇÑ´Ù. ÀÌ´Â µð¹ö±× ¸ðµåÀÇ °æ¿ìÁö¸¸, ¸±¸®Áî ¸ðµå·Î ÇÒ °æ¿ì, Ä¿¸Çµå¿¡ ÀÖ´Â /Zi Ç÷¡±×¸¦ Á¦°ÅÇÏ¸é µÈ´Ù.
OutputsÀÇ ÅؽºÆ®¹Ú½º¿¡´Â,
$(OutDir)\$(InputName).obj
·Î ¼³Á¤ÇØ ÁØ´Ù. ÀÌÁ¦ºÎÅÍ´Â VC¿¡¼, Build-> Run À» ¼±ÅÃÇϸé, ÀÚµ¿À¸·Î ¾î¼ÀºíÇØÁÖ°í ¸µÅ©µµ VC++°¡ ¾Ë¾Æ¼ ÇØÁÖ°Ô µÈ´Ù. ÇÏÁö¸¸, Á¶±Ý ¹ø°Å·Î¿î°ÍÀº, ÆÄÀÏÀ» ÀÛ¼ºÇÒ ¶§ ¸¶´Ù Ä¿½ºÅÒ ºôµå¸¦ ¼³Á¤ÇØ Áà¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù.
Á» ´õ ÀÚ¼¼ÇÑ ÀÚ·á´Â ´ÙÀ½ºÎºÐÀ» Âü°íÇϱ⠹ٶõ´Ù¡¡¡æ¡¡Microsoft Support Q106399 ¡¡(¿µ¾î)
Ä¿½ºÅÒ ºôµå¿¡ ´ëÇØ, Á» ´õ ÀÚ¼¼ÇÏ°Ô ¾Ë°í ½Í´Ù¸é, MSDN¿¡ ÀÚ·á°¡ ¾ÆÁÖ »ó¼¼ÇÏ°Ô ¼³¸íµÇ¾î Àֱ⠶§¹®¿¡, ±×ºÎºÐÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.
Chapter 1 - 4 ¡¡ ÃÖÃÊÀÇ MASM ÇÁ·Î±×·¥
¸ðµç¾ð¾îÀÇ Ç¥ÁØ ÀÔ¹® ¹æ½ÄÀÎ ¡¸Hello World¡¹ÇÁ·Î±×·¥À», MASMÀ¸·Î °£´ÜÇÏ°Ô ¸¸µé¾î º¸ÀÚ. ¹°·Ð ¹«½¼ ³»¿ëÀÎÁö ¸ô¶óµµ »ó°ü¾ø´Ù. ¸ð¸£´Â°ÍÀÌ ´ç¿¬ÇÑ °ÍÀ̸ç, ±×·¡¼ º» ¹®¼°¡ Àִ°ÍÀÌ´Ù.
;********************************************************************** ; ÃÖÃÊ MASM ÇÁ·Î±×·¡¹Ö ; ÁÖ¼®Àº ¼¼¹ÌÄÝ·ÐÀ¸·Î ;********************************************************************** .586 .model flat, stdcall NULL EQU 0 MessageBoxA proto :dword, :dword, :dword, :dword ExitProcess proto :dword .data TITLE1 DB '¾î¼Àºí¸® Å×½ºÆ®', 0 MESSAGE DB '~Hello World!!~', 0 .code WinMainCRTStartup proc invoke MessageBoxA, NULL, offset MESSAGE, offset TITLE1, 0 invoke ExitProcess, 0 ret WinMainCRTStartup endp endÀÌ ³»¿ëÀ» ¾î¼Àºí(assemble) ÇÑ ÈÄ ½ÇÇàÇϸé(F5), "~Hello World!!~"¶ó°í Ç¥½ÃµÇ´Â ¸Þ½ÃÁö ¹Ú½º°¡ ȸ鿡 Ç¥½ÃµÈ´Ù.
(¾ÈµÈ´Ù¸é ½ÊÁß Æȱ¸ ¿ÀŸÀÌ´Ï º¹»çÇؼ ºÙ¿©³Ö±â ¹Ù¶õ´Ù)
(ÁÖÀÇ) À§ÀÇ ¼Ò½º¿¡´Â ÆíÀÇ»ó »öÀ» ´Ù¸£°Ô Ç¥½ÃÇßÁö¸¸, ½ÇÁ¦·Î´Â º¯ÇÏÁö ¾Ê´Â´Ù. (Àü¿ë ÅëÇÕȯ°æÀ» »ç¿ëÇÏ¸é ¸ðµç±â´ÉÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù. ¸¹Àº°ÍÀ» ¹Ù¶óÁö´Â ¸»±â ¹Ù¶õ´Ù. WinASM IDE¸¦ »ç¿ëÇ϶ó.)
Chapter 2 ¡¡ Çϵå¿þ¾îÀÇ ±¸Á¶
°³¿ä : ÄÄÇ»ÅÍ¿¡ ´ëÇؼ
À̹ø¿¡´Â, °£´ÜÇÏ°Ô Çϵå¿þ¾îÀÇ ±¸Á¶¿¡ ´ëÇØ ¼³¸íÇÑ´Ù. Çϵå¿þ¾îÀÇ ±¸Á¶¶ó ÇÏ´õ¶óµµ, USBÀÇ ±Ô°ÝÀ̳ª, ¸ÞÀκ¸µå´Â ¾î¶»°Ô ±¸¼ºµÇ¾î Àִ°¡, ±×·± °ÍÀ» ´Ù·ç´Â °ÍÀÌ ¾Æ´Ï´Ù. ´ëºÎºÐÀ» CPU ÀÇ ±¸Á¶¿¡ ´ëÇØ ¼³¸íÀ» ÇÒ °ÍÀÌ´Ù. ¡¸ÃÖ¼ÒÇÑ, À̰͸¸Àº ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÑ´Ù¡¹¶ó´Â ºÎºÐÀ» À§ÁÖ·Î Çؼ ¼³¸íÇØ ³ª°¥°ÍÀÌ´Ù.
´ÙÀ½ÀÇ ¼ø¼·Î ¼³¸í ÇÒ °ÍÀÌ´Ù.
- ¾î¼Àºí·¯¿¡¼ °¡´ÉÇÑ °Í
- ÀúÀåÀåÄ¡(·¹Áö½ºÅÍ/¸Þ¸ð¸®/½ºÅÃ)
- ¿ÜºÎ ÀԷ°ú ¿ÜºÎ Ãâ·Â(I/O)¡¤ÀÎÅÍ·´Æ®
- BIOS¡¤½Ã½ºÅÛ ÄÝ¡¤VRAM
Chapter 2 - 2 ¡¡ ¾î¼Àºí·¯¿¡¼ °¡´ÉÇÑ °Í
¸ÕÀú, ¿Ö ¾î¼Àºí·¯¸¦ »ç¿ë ÇÒ±î? ±× ÀÌÀ¯´Â, ¸î°¡Áö°¡ ÀÖ´Ù. ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹ÖÀº, C¾ð¾î·Îµµ ÃæºÐÇÏ´Ù. ÀϹÝÀûÀ¸·Î ¸»ÇØ, ¾ð¾î°¡ °í±ÞÀ¸·Î µÉ¼ö·Ï , ÀÎÅÍÇÁ¸®ÅͼºÀÌ ³ô¾ÆÁ®¼ , ¾ð¾î°¡ »ç¶÷ÀÌ ÀÌÇØÇϱ⠽¬¿öÁöÁö¸¸, ±× ¾ð¾î·Î ½ÇÁ¦ ¼öÇàµÇ´Â ºÎºÐÀº ¿ÀÈ÷·Á °¨¼ÒÇÏ°Ô µÈ´Ù. Áï, Basic°ú C¾ð¾îÀÇ ¿¹¸¦ µé¸é, Basic¿¡¼ ÇÒ¼ö ÀÖ´Â ÀÏÀº C¾ð¾î·Îµµ ¼öÇà ÇÒ ¼ö ÀÖ´Ù.ÇÏÁö¸¸ ¹Ý´ë·Î, C¾ð¾î·Î ¼öÇàÇÒ ¼ö ÀÖ´Â °ÍÀÌ ¹Ýµå½Ã Basic ¿¡¼ ¼öÇàµÈ´Ù´Â º¸ÀåÀº ¾ø´Ù. °°Àº ¸Æ¶ôÀ¸·Î C¾ð¾î¿Í ¾î¼Àºí·¯ÀÇ °ü°è¿¡¼µµ Á¸ÀçÇÑ´Ù. ¿¹¸¦ µé¾î C¾ð¾î¿¡¼´Â, Çϵå¿þ¾î¸¦ Á÷Á¢Á¶ÀÛÀº ÇÒ ¼ö ¾ø´Ù(¹°·Ð ÀζóÀξî¼Àºí¸®¸¦ »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸). ´ÜÁö ¿¹¸¦ µç°ÍÀÌ´Ù. ±×·¸±â ¶§¹®¿¡, Á÷Á¢ Çϵå¿þ¾î¸¦ Á¶ÀÛÇÏ°í ½ÍÀº °æ¿ì µî¿¡ ¾î¼Àºí·¯¸¦ »ç¿ëÇÑ´Ù. Á÷Á¢ ÇÏµå µð½ºÅ©ÀÇ Æ®·¢À̳ª ¼½Å͸¦ Á¶ÀÛÇÏ°í ½ÍÀº °æ¿ì¿¡ ¾î¼Àºí·¯¸¦ »ç¿ëÇÑ´Ù¶ó°í »ý°¢Çϸé ÀÌÇØÇϱ⠽¬¿ï °ÍÀÌ´Ù.
ÇÁ·Î±×·¥ÀÌ °í¼Ó¼ºÀ» ¿ä±¸ÇÏ´Â °æ¿ì, C¾ð¾îº¸´Ù ¾î¼Àºí·¯ ÂÊÀÌ ÀϹÝÀûÀ¸·Î ºü¸£±â ¶§¹®¿¡, ÀÌ·± °æ¿ì´Â ¾î¼Àºí·¯¿¡¼ ÇÁ·Î±×·¥À» ÁַΠ§´Ù. ±×·¸Áö¸¸, ¾î¼Àºí·¯´Â ³Ê¹« ·Î¿ì·¹º§À̹ǷÎ, ÇÁ·Î±×·¡¹Ö¿¡´Â »ó´çÇÑ ³ë·ÂÀ» ÇÊ¿ä·Î ÇÏ°í ÄÚµùÀÇ ¾çµµ ¸¹¾ÆÁø´Ù. ±×·¯¹Ç·Î, ¾î¼Àºí·¯¿¡¼¸¸ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °ÍÀº, Çö½ÇÀûÀÌÁö´Â ¾Ê´Ù. ¸¹Àº °æ¿ì, C¾ð¾îµîÀÇ °í±Þ(Áß±Þ) ¾ð¾î¿Í ÇÔ²² Á¶ÇÕÇؼ »ç¿ëÇÏ°Ô µÈ´Ù.
Chapter 2 - 3 ¡¡ ÀúÀåÀåÄ¡(·¹Áö½ºÅÍ/¸Þ¸ð¸®/½ºÅÃ)
±â¾ïÀåÄ¡¿¡´Â, 3 Á¾·ù°¡ ÀÖ´Ù. ·¹Áö½ºÅÍ¿Í ¸Þ¸ð¸®¿Í ½ºÅÃÀÌ´Ù. ÀÌ ¹Û¿¡µµ, º¸Á¶±â¾ïÀåÄ¡·Î ÇÏµå µð½ºÅ©³ª Ç÷ÎÇÇ µð½ºÅ©µîÀÌ ÀÖ´Ù. ¾î¼Àºí·¯¿¡¼´Â, ÁÖ·Î ·¹Áö½ºÅÍ¿Í ½ºÅÃÀ» ÀÌ¿ëÇÑ´Ù.
·¹Áö½ºÅÍ´Â, CPUÀÇ ³»ºÎ¿¡ ÀÖ´Â ±â¾ïÀåÄ¡ÀÌ´Ù. CPUÀÇ ³»ºÎ¿¡ Á¸ÀçÇϹǷÎ, ¾×¼¼½º ¼Óµµ ¶ÇÇÑ ¾ÆÁÖ ºü¸£´Ù. ±×·¸Áö¸¸, ·¹Áö½ºÅÍ´Â, ¹«ÇÑÁ¤À¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ÀÚ¿øÀÌ ¾Æ´Ï´Ù. ·¹Áö½ºÅÍÀÇ Á¾·ù¿¡´Â, 3°³ ÀÖ´Ù. ¹ü¿ë ·¹Áö½ºÅÍ,¼¼±×¸ÕÆ® ·¹Áö½ºÅÍ,Ç÷¡±× ·¹Áö½ºÅÍ.
·¹Áö½ºÅÍ Á¾·ù Çؼ³ ¹ü¿ë ·¹Áö½ºÅÍ8°³°¡ ÀÖ´Ù. ÇÁ·Î±×·¥¿¡¼ »ç¿ëµÈ´Ù. ¼¼±×¸ÕÆ® ·¹Áö½ºÅÍ6°³°¡ ÀÖ´Ù. ¼¼±×¸ÕÆ®(segment)ÀÇ °ü¸®¿¡ »ç¿ëµÈ´Ù. »óÅ ·¹Áö½ºÅÍ1°³°¡ ÀÖ´Ù. CPU »óŸ¦ ±â¾ïÇÑ´Ù. ÀϹÝÀûÀ¸·Î º¯°æÇÒ ¼ö ¾ø´Ù. ÇÁ·Î±×·¡¹Ö¿¡¼´Â, °ÅÀÇ ´ëºÎºÐ ¹ü¿ë ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ´Ù. ¹ü¿ë ·¹Áö½ºÅÍ¿¡´Â, ´ÙÀ½ÀÇ 8°¡Áö°¡ ÀÖ´Ù. ¸ðµÎ 32 ºñÆ®ÀÌ´Ù.
·¹Áö½ºÅ͸í Çؼ³ EAX¾îÅ¥¹°·¹ÀÌÅÍ. ¼öÄ¡°è»ê¿¡ »ç¿ëµÇ´Â ·¹Áö½ºÅÍ. EBXº£À̽º ·¹Áö½ºÅÍ. º¸Á¶ °è»êÀ̳ª, ±× ¿ÜÀÇ ¿ëµµ¿¡ »ç¿ëµÇ´Â ·¹Áö½ºÅÍ. ECXÄ«¿îÅÍ ·¹Áö½ºÅÍ. º¸Á¶ °è»êÀ̳ª, Ä«¿îÅÍ, ·çÇÁ¿¡¼ »ç¿ëµÇ´Â ·¹Áö½ºÅÍ. EDXµ¥ÀÌÅÍ ·¹Áö½ºÅÍ. º¸Á¶ °è»êÀ̳ª, µ¥ÀÌÅÍ¿ë Á¶ÀÛ¿ëÀÇ ·¹Áö½ºÅÍ. ESI¼Ò½º À妽º. º¸Á¶ °è»êÀ̳ª, µ¥ÀÌÅÍ Ã³¸® ÀνºÆ®·°¼ÇÀ¸·Î »ç¿ëµÇ´Â ·¹Áö½ºÅÍ. EDI¸ñÀûÁö À妽º. º¸Á¶ °è»êÀ̳ª, µ¥ÀÌÅÍ Ã³¸® ÀνºÆ®·°¼ÇÀ¸·Î »ç¿ëµÇ´Â ·¹Áö½ºÅÍ. ESP½ºÅà Æ÷ÀÎÅÍ. ½ºÅà 󸮷Π»ç¿ëµÇ´Â ·¹Áö½ºÅÍ. EBPº£À̽º Æ÷ÀÎÅÍ. ½ºÅà 󸮷Π»ç¿ëµÇ´Â ·¹Áö½ºÅÍ. C¾ð¾î¿¡¼ º¯¼öÀÇ ¼ö½ÄÀÚ¿¡ register ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.(·¹Áö½ºÅͺ¯¼ö) ÀÌ·± °æ¿ì ½ÇÁ¦·Î´Â, º¯¼ö¿¡ ESI(¼Ò½º À妽º)¿Í EDI(¸ñÀûÁö À妽º)¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.¶ÇÇÑ, °è»ê¿ëÀÇ ·¹Áö½ºÅͷμ ESP(½ºÅà Æ÷ÀÎÅÍ)¿Í EBP (º£À̽º Æ÷ÀÎÅÍ) ¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ÀÌ·± ·¹Áö½ºÅÍ µéÀº, ½ºÅðü¸®¶ó°í ÇÏ´Â Áß¿äÇÑ ÀÓ¹«°¡ Àֱ⠶§¹® ÀÌ´Ù. ¼öÄ¡°è»êÀº, ½ÇÁúÀûÀ¸·Î 6°³ÀÇ ·¹Áö½ºÅÍ·Î ÇÏ°Ô µÈ´Ù. °¢°¢ÀÇ ·¹Áö½ºÅÍ¿¡´Â, °íÀ¯ÇÑ ¿ªÇÒµµ ÀÖÀ¸¹Ç·Î, °Å±â¿¡ ¸ÂÃç¼ ÇÁ·Î±×·¥À» Â¥Áö ¾ÊÀ¸¸é ¾ÈµÈ´Ù. ¿Ö ÀÌ·± ¾ö°ÝÇÑ ·êÀÌ Á¸ÀçÇÏ´ÂÁö¸¦ Å¿ÇÏÁö ¸»±â ¹Ù¶õ´Ù. ÄÄÇ»ÅÍ´Â º¹ÀâÇÑ ÀåÄ¡ÀÌ´Ù. ÇÏÁö¸¸ ÀÌ·± ±âÃÊÀûÀÎ ·ê¸¸ ÀÍÈ÷¸é ¾î¶²¾ð¾îº¸´Ù °·ÂÇÔÀ» ¾òÀ»¼ö ÀÖ´Ù. ´ëÃæ ¾Æ´Â ¾ð¾î¿Í´Â ´Ù¸¥ °ÍÀÌ´Ù.
32 ºñÆ®ÀÇ °æ¿ì, ´©»ê±â´Â EAX ·Î Ãë±ÞÇÏÁö¸¸ ÇÏÀ§ 16 ºñÆ®¸¦ AX ·Î¼ ´Ù·ê ¼öµµ ÀÖ´Ù. AX ´Â ¶Ç ´Ù½Ã, »óÀ§ 8 ºñÆ®¸¦ AH , ÇÏÀ§ 8 ºñÆ®¸¦ AL ·Î ³ªÅ¸³½´Ù. ÀÌ°ÍÀº, EBX ECX EDX ÀÇ °æ¿ìµµ °°´Ù.
±×·¸´Ù¸é, ÀÌÁ¦ ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥À» »ìÆ캸ÀÚ.
;***************************************************************** ; ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥ ;***************************************************************** .586 ; Pentium ¿ëÀÇ Äڵ带 ¾²´Â °æ¿ì ÇÊ¿ä .model flat, stdcall NUM EQU 1 wsprintfA proto c :dword, :dword, :dword, :dword, :dword MessageBoxA proto :dword, :dword, :dword, :dword ExitProcess proto :dword .data BUFFER DB 64 DUP(0) STRINGS DB '%d + %d = %d', 0 TITLENAME DB '°á°ú´Â? ', 0 .code WinMainCRTStartup proc mov eax, NUM ; ´©»ê±â¿¡ ´ëÀÔ mov ebx, NUM + 1 ; º£À̽º ·¹Áö½ºÅÍ¿¡ ´ëÀÔ add eax, ebx ; ´©»ê±â¿Í º£À̽º ·¹Áö½ºÅ͸¦ ´õÇÑ´Ù invoke wsprintfA, offset BUFFER, offset STRINGS, NUM, ebx, eax invoke MessageBoxA, 0, offset BUFFER, offset TITLENAME, 0 invoke ExitProcess, 0 ret WinMainCRTStartup endp endµ¡¼ÀÀ» ÇÑ ÈÄ, ¸Þ½ÃÁö ¹Ú½º·Î Ç¥½ÃÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù("1+2=3"). ·¹Áö½ºÅÍ´Â, EAX(´©»ê±â)¿Í EBX(º£À̽º ·¹Áö½ºÅÍ)¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. ÇÁ·Î±×·¥¿¡¼ mov ³ª add µîÀ» ´Ï¸ð´ÐÀ̶ó ÇÑ´Ù. ´Ï¸ð´ÐÀº, ±â°è¾îÀÇ ºñÆ® Ç¥ÇöÀ» ¹®ÀÚÇ¥ÇöÀ¸·Î ³ªÅ¸³½ °ÍÀÌ´Ù. ¿¹¸¦ µé¾î mov ¶ó¸é, MOVe ÀÇ ¾àÀÚ·Î ¡¸´ëÀÔ¡¹À» ÀǹÌÇÑ´Ù. add (Àº)´Â ADD ·Î ¡¸°¡»ê¡¹À» ÀǹÌÇÑ´Ù. ÇÁ·Î±×·¥¿¡¼´Â ´©»ê±â¿Í º£À̽º ·¹Áö½ºÅÍ¿¡ ¼ö¸¦ ´ëÀÔÇؼ ,µ¡¼ÀÀ» ¼öÇàÇÏ°í ÀÖ´Ù.
MASM¿¡¼, ÇÔ¼ö¸¦ ÇÁ·Î½ÃÀú¶ó°í ºÎ¸¥´Ù. ÇÁ·Î½ÃÀúÀÇ Á¤ÀÇ´Â, proc - endp ·Î ÇÑ´Ù. À§ÀÇ ¿¹¿¡¼´Â , WinMainCRTStartup ¶ó´Â ÇÁ·Î½ÃÀú°¡ Á¤ÀǵǾî ÀÖ°í, ±× »çÀÌÀÇ ±â°è¾î ÀνºÆ®·°¼ÇÀÌ ½ÇÇàµÇ°í ÀÖ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù.
ÀÌ ÇÔ¼ö´Â ½ºÅ¸Æ® ¾÷ ÄÚµå(Startup Code)·Î ºÒ¸®°í ÇÁ·Î±×·¥¿¡¼ °¡Àå ¸ÕÀú È£ÃâµÇ´Â ÇÔ¼ö´Ù. º¸Åë C·Î ÇÁ·Î±×·¥À» Â¥´Â °æ¿ì, ½ºÅ¸Æ® ¾÷ ÄÚµå´Â ÀÚµ¿À¸·Î »ý¼ºµÇ¾î ¸µÅ© µÈ´Ù. ¶ÇÇÑ ½ºÅ¸Æ® ¾÷ ÄÚµå´Â, ÇÁ·Î±×·¥À» ÃʱâÈÇϴµ¥ »ç¿ëµÈ´Ù. VC++ ·Î Windows ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °æ¿ì, ½ºÅ¸Æ® ¾÷ ÄÚµå´Â WinMainCRTStartup ÇÔ¼öÁö¸¸, Console ¿ëÀÇ ÇÁ·Î±×·¥ÀÇ °æ¿ì´Â mainCRTStartup ÇÔ¼ö°¡ ½ºÅ¸Æ® ¾÷ Äڵ尡 µÈ´Ù. ÅëÇÕ È¯°æ¿¡ ÀÇÇØ, ½ºÅ¸Æ® ¾÷ ÄÚµå ÇÔ¼öÀÇ À̸§Àº °¢°¢ ´Ù¸£´Ù.¹Ýµå½Ã Á¤ÇØÁø°ÍÀº ¾Æ´Ï´Ù. °³¹ßÀÚ ¸¶À½ÀΰÍÀÌ´Ù. mainÀ̶õ°ÍÀ» ãÁö¸¸ ¸»±â ¹Ù¶õ´Ù. ÀÌ°ÍÀº C¾ð¾îÀÇ ·êÀÏ »ÓÀÌ´Ù.½ÇÁ¦·Î´Â ÀÌ·±°ÍÀº ¾ø´Ù.
Chapter 2 - 4 ¡¡ ±× ¿Ü ·¹Áö½ºÅÍ
»óÅ ·¹Áö½ºÅÍ(flag register)´Â, Çϳª ¹Û¿¡ ¾ø´Ù. ·¹Áö½ºÅÍÀÇ ³»ºÎ´Â, CPU »óŸ¦ º¸Á¸ÇÏ°í ÀÖ´Ù. ÀϹÝÀûÀ¸·Î »óÅ ·¹Áö½ºÅÍ Àüü¸¦ º¯°æÇÒ ¼ö ¾ø´Ù(½ºÅÃÀ» »ç¿ëÇÏ¸é º¯°æÇÒ ¼ö ÀÖÁö¸¸, ±ÇÇÏ´Â ¹æ¹ýÀº ¾Æ´Ï´Ù pushf / popf). Ç÷¡±×ÀÇ Á¾·ù´Â,»óÅ Ç÷¡±×,Á¦¾î Ç÷¡±×,½Ã½ºÅÛ Ç÷¡±×ÀÇ 3°³°¡ ÀÖ´Ù. »óÅ Ç÷¡±×´Â, ¿¬»êÀÇ °á°ú »óÅ°¡ º¸Á¸µÈ´Ù. »óÅ Ç÷¡±×ÀÇ Á¾·ù´Â ´ÙÀ½°ú °°´Ù.
Ç÷¡±×¸í ºñÆ® Çؼ³ CF (Carry Flag) 0 carry flag. ÀÚ¸®¼ö°¡ ¿Ã¶ó°¡¸é ¼¼Æ®. PF (Parity Flag) 2 Æи®Æ¼Ç÷¡±×. ¿¬»ê °á°ú°¡ ¦¼öÀÏ °æ¿ì ¼¼Æ®. AF (Adjust Flag) 4 Á¶Àý Ç÷¡±×. 2 ÁøÈ 10Áø(BCD) ¿¬»ê¿¡¼ »ç¿ë. ZF (Zero Flag) 6 Á¦·Î Ç÷¡±×. ¿¬»ê °á°ú°¡ Á¦·ÎÀÏ °æ¿ì ¼¼Æ®. SF (Sign Flag) 7 ºÎÈ£ Ç÷¡±×. ¿¬»ê °á°ú°¡ ºÎÈ£°¡ ÀÖ´Â °æ¿ì ¼¼Æ®. OF (Overflow Flag) 11 ¿À¹öÇ÷οì Ç÷¡±×. ¿À¹öÇ÷ο찡 ¹ß»ýÇÏ¸é ¼¼Æ®. ÀϹÝÀûÀ¸·Î »óÅ Ç÷¡±×´Â º¯°æÇÒ ¼ö ¾øÁö¸¸, carry flag´Â º¯°æ °¡´ÉÇÏ´Ù. ´Ï¸ð´Ð STC (SeT Carry flag), CLC (CLear Carry flag) ÀνºÆ®·°¼ÇÀ¸·Î º¯°æÇÒ ¼ö ÀÖ´Ù.
Á¦¾î Ç÷¡±×´Â DF (Direction Flag ; ¹æÇâ Ç÷¡±×) ¹Û¿¡ ¾ø´Ù. string ÀνºÆ®·°¼Ç(¸Þ¸ð¸® Àü¼Û ÀνºÆ®·°¼Ç)¿¡¼, ¸Þ¸ð¸® Àü¼Û ¹æÇâÀ» ÁöÁ¤ÇÑ´Ù. ´Ï¸ð´ÐÀ¸·Î´Â, STD (SeT Direction flag) CLD (CLear Direction flag)¸¦ »ç¿ëÇÑ´Ù.
½Ã½ºÅÛ Ç÷¡±×´Â, °¡»ó 8086 ÀνºÆ®·°¼ÇÀ̳ª ÀÎÅÍ·´Æ® Á¦¾î µî¿¡ »ç¿ëµÇÁö¸¸ º» ¹®¼¿¡¼´Â ¼³¸íÇÏÁö ¾Ê´Â´Ù.ÀÎÅÚÀÇ ¾ÆÅ°ÅØÃÄ ¸Þ´º¾óÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.
±×·¯¸é, »óÅ ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ.
;***************************************************************** ; »óÅ ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥ ;***************************************************************** .586 .model flat, stdcall ; ¸Þ¸ð¸®¸ðµ¨Àº Ç÷§À¸·Î¡¦ NUM equ 1 wsprintfA proto c :dword, :dword, :dword MessageBoxA proto :dword, :dword, :dword, :dword ExitProcess proto :dword .data BUFFER db 64 DUP(0) STRINGS db '2ÀÇ 10½ÂÀº %d ÀÔ´Ï´Ù', 0 TITLENAME db '2ÀÇ 10½ÂÀ» Ǫ´Â ¹®Á¦', 0 .code WinMainCRTStartup proc mov eax, NUM mov ecx, 10 MYLOOP: mov ebx, eax add eax, ebx dec ecx ; ecx ÀÇ °ªÀ» 1 °¨¼Ò jnz MYLOOP ; Á¦·Î Ç÷¡±×°¡ ¼¼Æ® µÇÁö¾ÊÀ¸¸é ·çÇÁ invoke wsprintfA, offset BUFFER, offset STRINGS, eax invoke MessageBoxA, 0, offset BUFFER, offset TITLENAME, 0 invoke ExitProcess, 0 ret WinMainCRTStartup endp end¸ÕÀú WinMainCRTStartup ÇÔ¼öÀÇ ³»¿ëº¸ÀÚ. À̹ø¿¡´Â 2ÀÇ 10½ÂÀ» ±¸ÇÏ´Â ¹®Á¦ÀÌ´Ù("2ÀÇ 10½ÂÀº 1024ÀÔ´Ï´Ù"). ECX ·¹Áö½ºÅÍÀÇ ³»¿ëÀ» 1¾¿ °¨¼ÒÇØ °¡¸é¼, ECX ·¹Áö½ºÅÍ°¡ 0ÀÌ µÇ¸é Á¾·áÇÏ´Â ·çÇÁ¸¦ ¸¸µé¾ú´Ù. dec (DECrement)¶ó´Â ´Ï¸ð´ÐÀº, ·¹Áö½ºÅÍÀÇ ³»¿ëÀ» 1 °¨¼Ò½ÃÅ°´Â ÀνºÆ®·°¼ÇÀÌ´Ù(C¿¡¼ abc--). jnz (Jump if Non-Zero flag)¶õ, Á¦·Î Ç÷¡±×°¡ ¼¼Æ®µÇÁö ¾Ê´Â µ¿¾È, ÁöÁ¤µÈ ÁÖ¼Ò¿¡ Á¡ÇÁ ÇÏ´Â Á¶°Ç Á¡ÇÁ ÀνºÆ®·°¼ÇÀÌ´Ù. ¿©±â¿¡¼´Â MYLOOP ¶ó°í ÇÏ´Â ÁÖ¼Ò·Î Á¡ÇÁ ÇÑ´Ù. MYLOOP ¿Í °°ÀÌ, À̸§ÀÇ µÚ¿¡ ±¸µÎÁ¡À»(ÄÝ·Ð) ºÙ¿©¼ ÁÖ¼Ò¿¡ À̸§À» ÁöÁ¤ÇÒ ¼ö°¡ ÀÖ´Ù.(·¹À̺í)
À̹ø ¿¹Á¦¿¡¼´Â »óÅ Ç÷¡±×ÀÇ »ç¿ë¹ýÀ» º¸±â À§Çؼ, ±ÍÂúÀº ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¡¹ÖÇßÁö¸¸, ·çÇÁ¸¦ ÇÒ °æ¿ì´Â Á» ´õ Æí¸®ÇÑ ´Ï¸ð´ÐÀÌ ÁغñµÇ¾î ÀִٹٷΠloop (LOOP if ecx is non-zero) ¶ó´Â °ÍÀÌ ÀÖ´Ù. À§ÀÇ ³»¿ëÀ» ´Ù½Ã ÀÛ¼ºÇÏ¸é ¾Æ·¡¿Í °°ÀÌ µÈ´Ù.
mov ecx, 10 ; ·çÇÁ ½ÃÅ°°í ½ÍÀº Ƚ¼ö¸¸ ECX ¿¡ ´ëÀÔ MYLOOP: mov ebx, eax mov eax, ebx loop MYLOOP ; ECX ¸¦ 1ÁÙ¿© 0ÀÌ µÉ ¶§±îÁö ¹Ýº¹ÇÑ´Ù¶ÇÇÑ ½ÇÁ¦·Î , 2ÀÇ °è½ÂÀ» ±¸ÇÏ´Â Á» ´õ °£´ÜÇÑ ¹æ¹ýµµ ÀÖ´Ù. ½¬ÇÁÆ®¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù.
¼¼±×¸ÕÆ®(segment) ·¹Áö½ºÅÍÀÇ Á¾·ù¿¡´Â ´ÙÀ½°ú °°Àº Á¾·ù°¡ ÀÖ´Ù. ¸ðµÎ 16 ºñÆ®ÀÌ´Ù.
·¹Áö½ºÅÍ Çؼ³ CS ÄÚµå ¼¼±×¸ÕÆ® ½ÇÇà Äڵ尡 Á¸ÀçÇÏ´Â ¼¼±×¸ÕÆ® DS ES FS GS µ¥ÀÌÅÍ ¼¼±×¸ÕÆ® µ¥ÀÌÅÍ°¡ Á¸ÇÏ´Â ¼¼±×¸ÕÆ® SS ½ºÅà ¼¼±×¸ÕÆ® ½ºÅÃÀÌ Á¸ÀçÇÏ´Â ¼¼±×¸ÕÆ® 16 ºñÆ® ½ÃÀý¿¡´Â DS¿Í ES°¡ ÀÖ¾úÁö¸¸, ÇöÀç¿¡´Â FS DS °¡ ´õÇØÁ®¼, ¸ðµÎ ¡¸µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®¡¹¶ó°í ºÒ·ÁÁø´Ù.
¼¼±×¸ÕÆ®(segment)¶õ, ¿¬¼ÓµÈ ¸Þ¸ð¸®¸¦ ÇÊ¿ä¿¡ µû¶ó¼ ºÐÇÒÇÏ°í, ±× ÇϳªÇϳª¸¦ °¡¸®Å°´Â ÀǹÌÀÌ´Ù. ¿¹¸¦ µé¾î, 1°³ÀÇ ÇÁ·Î±×·¥¿¡´Â, ½ÇÇà ÄÚµå¿Í µ¥ÀÌÅÍ°¡ ÀÖ´Ù. ÀÌ°ÍÀ» ºÐÇÒÇÑ ¿µ¿ª¿¡ µÎ´Â°ÍÀÌ ¹Ù·Î, ¼¼±×¸ÕÆ®(segment)ÀÇ ¹ß»óÀÌ´Ù. ¿¹¸¦ µé¸é, ½ÇÇà ÄÚµå´Â CS ¼¼±×¸ÕÆ®(segment)¿¡ ³õ¿©Áö°í, µ¥ÀÌÅÍ´Â DS ¼¼±×¸ÕÆ®(segment)¿¡ ³õ¿©Áö°Ô µÈ´Ù. ¼¼±×¸ÕÆ®(segment)´Â °°Àº ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸®¿¡ ÇÒ´çÇÒ ¼ö ÀÖ°í, ¼¼±×¸ÕÆ®(segment)³¢¸® ¼·Î °ãÃÄ Áö´Â °æ¿ìµµ ÀÖ´Ù.
¿¹Á¦ ÇÁ·Î±×·¥À» º¸¸é .code ¶ó°í ÇÏ´Â code segment¸¦ Á¤ÀÇÇÏ°í ÀÖ´Ù. ¶ÇÇÑ .data ¶ó´Â µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®¸¦ Á¤ÀÇÇÏ°í ÀÖ´Ù. ±× ¹Û¿¡µµ .stack µîµµ ÀÖ¾î¼, ½ºÅà ¼¼±×¸ÕÆ®µµ Á¤ÀÇÇÒ ¼ö°¡ ÀÖ´Ù. ÇϳªÀÇ ¼¼±×¸ÕÆ®(segment)¿¡´Â, 4 G¹ÙÀÌÆ®±îÁö(!) »ç¿ëÇÒ ¼ö ÀÖ´Ù(2ÀÇ 32½Â : ±×·¡¼ 32ºñÆ®). ¿¹¸¦ µé¾î CS ¼¼±×¸ÕÆ®(segment)¶ó¸é CS:00000000h ~ CS:FFFFFFFFh ±îÁöÀÇ ¿µ¿ªÀÌ Á¸ÀçÇÑ´Ù. ¹°·Ð, ½ÇÁ¦ ¸Þ¸ð¸®´Â ÀÌ·¸°Ô »ç¿ëµÇÁö´Â ¾Ê´Â´Ù. ´ÜÁö ¿¹¸¦ µç °ÍÀÌ´Ù.
±â¾ïÀåÄ¡ÀÌ´Ù.¡¸¸Þ¸ð¸®¡¹¿¡ °ªÀ» ´ëÀÔÇÒ ¼öµµ ÀÖ´Ù. ¿ì¼±, ÇÁ·Î±×·¥À» º¸ÀÚ.
;***************************************************************** ; ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ ;***************************************************************** .586 .model flat, stdcall ; stdcall Àº ÇÔ¼öÀÇ È£Ãâ ¹æ¹ýÀ» Á¤ÀÇ! NUM equ 32 MessageBoxA proto :dword, :dword, :dword, :dword ExitProcess proto :dword .data BUFFER db 128 dup(? ) TITLENAME db '¸Þ¸ð¸®¿¡ ´ëÀÔÇÏ´Â ÇÁ·Î±×·¥', 0 .code WinMainCRTStartup proc mov ecx, NUM ; Ä«¿îÅÍÀÇ È¸¼ö mov edx, offset BUFFER ; ¹öÆÛÀÇ Æ÷ÀÎÅÍ mov ah, 20h ; _LOOP0: mov byte ptr [edx], ah inc ah inc edx loop _LOOP0 invoke MessageBoxA, 0, offset BUFFER, offset TITLENAME, 0 invoke ExitProcess, 0 ret WinMainCRTStartup endp endÀ̹ø ÇÁ·Î±×·¥Àº, 128¹ÙÀÌÆ®ÀÇ Á¤Àû ¹öÆÛ¸¦ È®º¸ÇÏ°í, ±× ¿µ¿ª¿¡ ¹®ÀÚ¸¦ Â÷·ÊÂ÷·Ê ´ëÀÔÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ½ÇÁ¦·Î ¡¸ ! "#$%&'()*+,-. /0123456789:<=>?¡¹¶ó´Â ¹®ÀÚ°¡ ´ëÀԵȴÙ. ASCII ÄÚµåÀÇ 20h ºÎÅÍ 3Fh ±îÁöÀÌ´Ù. ¸Þ¸ð¸®¿¡ ´ëÀÔÇÏ´Â °æ¿ì¿¡´Â ptr ¿¬»êÀÚ¸¦ »ç¿ëÇÑ´Ù. [edx]¶õ edx °¡ °¡¸®Å°´Â ¸Þ¸ð¸®¸¦ ³ªÅ¸³À´Ï´Ù. byte ptr [edx] ¶õ, ¡¸edx °¡ °¡¸®Å°´Â ¸Þ¸ð¸®¿¡ ¹ÙÀÌÆ®°ª(8 ºñÆ®)À¸·Î °ªÀ» ´ëÀÔÇ϶󡹶ó´Â ÀǹÌÀÌ´Ù. ¿öµå°ªÀ¸·Î °ªÀ» ´ëÀÔÇÏ´Â °æ¿ì¿¡´Â, word ptr [edx] °¡ µÈ´Ù. C¿¡¼ ¾î·Æ´Ù°í ÇÏ´Â "Æ÷ÀÎÅÍ"ÀÌ´Ù. ¾î¼Àºí¸®¿¡¼´Â ±âº»ÀÌ Æ÷ÀÎÅÍÀ̹ǷÎ, º¹ÀâÇÏÁö ¾Ê´Ù. ÇÊÀÚÀÇ °æ¿ìµµ
óÀ½¿¡ C¸¦ ÇÒ¶§ ±¦È÷ Çò°¥·È´Ù. ¿ÀÈ÷·Á.......
½ºÅÃÀº, ÈÄÀÔ¼±Ãâ (Last-In First-Out) ÇüÅÂÀÇ µ¥ÀÌÅÍ ±¸Á¶ÀÌ´Ù. ¾î¼Àºí·¯¿¡¼ ½ºÅÃÀº Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù. ·¹Áö½ºÅÍÀÇ ³»¿ëÀ» ÀϽÃÀûÀ¸·Î ÀúÀåÇϰųª ÇÁ·Î½ÃÀú È£Ã⠽ÿ¡ Àμö¸¦ ½ºÅÿ¡ ³Ö°Å³ª ÇÑ´Ù. ƯÈ÷ C¾ð¾î³ª Pascal µîÀº, ÇÔ¼ö È£Ãâ½Ã Àμö¸¦ ½ºÅÿ¡ ³Ö¾î È£ÃâÀ» ¼öÇàÇÑ´Ù.ÀÌ°ÍÀ» ÇÔ¼öÈ£Ãâ ±Ô¾àÀ̶ó°í ºÎ¸¥´Ù.
±×·¸´Ù¸é, ½ºÅÃÀ» ÀÌ¿ëÇÑ ÇÁ·Î±×·¥À» º¸ÀÚ.
;***************************************************************** ; ½ºÅÃÀ» »ç¿ëÇÑ ÇÁ·Î±×·¥ ;***************************************************************** .586 .model flat, stdcall NUM equ 5 wsprintfA proto c :dword, :dword, :dword MessageBoxA proto :dword, :dword, :dword, :dword ExitProcess proto :dword .data BUFFER db 64 dup(0) TITLENAME db '½ºÅÃÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥', 0 STR1 db 'Ä«¿îÆ®´Ù¿î %d', 0 .code WinMainCRTStartup proc mov ecx, NUM _LOOP0: push ecx ; SubFunc ·Î ECX ¸¦ ½ºÅÿ¡ º¸Á¸ call SubFunc pop ecx loop _LOOP0 invoke ExitProcess, 0 ret WinMainCRTStartup endp SubFunc proc ; »õ·Î¿î ÇÁ·Î½ÃÀú¸¦ Á¤ÀÇ invoke wsprintfA, offset BUFFER, offset STR1, ecx invoke MessageBoxA, 0, offset BUFFER, offset TITLENAME, 0 mov ecx, 99 ; ¿©±â¼ ECX ÀÇ °ªÀ» ¹Ù²ãµµ, ½ºÅÿ¡ °ªÀÌ º¸Á¸µÇÀֱ⠶§¹®¿¡ ¹®Á¦¾ø´Ù ret SubFunc endp endÀ̹ø¿¡´Â, SubFunc ¶ó´Â »õ·Î¿î ÇÁ·Î½ÃÀú(ÇÔ¼ö)¸¦ ¸¸µé¾î º¸¾Ò´Ù. °£´ÜÇÑ ÇÁ·Î±×·¥À̹ǷÎ, Ưº°È÷ ¹®Á¦´Â ¾øÀ» °ÍÀÌ´Ù. ("Ä«¿îÆ®´Ù¿î 5")¶ó´Â °á°ú°¡ ³ª¿Â´Ù.ÀÌÈÄ "Ä«¿îÆ®´Ù¿î 4" "3"µîÀ¸·Î 1±îÁö °¨¼ÒÇÑ´Ù. push ´Ï¸ð´ÐÀº ·¹Áö½ºÅÍÀÇ ³»¿ëÀ» ½ºÅÿ¡ ´ëÀÔÇÑ´Ù. pop Àº ½ºÅÃÀ¸·ÎºÎÅÍ °ªÀ» ·¹Áö½ºÅÍ¿¡ ´ëÀÔÇÑ´Ù.½ºÅÃÀ» »ç¿ëÇÏ´Â MOVe¶ó°í »ý°¢ÇÏ¸é ½±´Ù. call Àº ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÑ´Ù. ÀÌ ¶§, ÇöÀç ½ÇÇàÁßÀÎ ÁÖ¼Ò¸¦ ½ºÅÿ¡ ´ëÀÔÇÏ°í ³ª¼ ÇÁ·Î½ÃÀú·Î Á¡ÇÁ ÇÑ´Ù. ÇÁ·Î½ÃÀú¿¡¼ µ¹¾Æ¿À´Â °æ¿ì¿¡, ret À» »ç¿ëÇÑ´Ù. ret Àº ½ºÅÃÀ¸·ÎºÎÅÍ °ªÀ» ²¨³»°í, È£Ãâ½Ã ¿ø·¡ÀÇ ÁÖ¼Ò·Î µ¹¾Æ¿À°Ô µÈ´Ù.
Chapter 2 - 7 ¡¡ I/0¡¤ÀÎÅÍ·´Æ®
CPU ·Î °è»ê¸¸ ¼öÇàÇؼ´Â, ÄÄÇ»ÅÍÀÇ ÁøÁ¤ÇÑ ´É·ÂÀ» »ç¿ë ÇÒ ¼ö°¡ ¾ø´Ù. ÄÄÇ»ÅÍÀÇ ±â´ÉÀ» È°¿ëÇϱâ À§Çؼ´Â, ÁÖº¯ÀåÄ¡ÀÇ ÀÔ·ÂÀ̳ª Ãâ·ÂÀ» Á¦¾îÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, Å°º¸µå·ÎºÎÅÍ ÀÔ·ÂÀ» ¹Þ´Â´Ù°Å³ª µð½ºÇ÷¹ÀÌ ÀåÄ¡¿¡¿¡ °á°ú¸¦ Ç¥½ÃÇϰųª. ÀÌ·±°ÍÀ» Á¦¾îÇϱâ À§Çؼ I/O °ø°£À» »ç¿ëÇÑ´Ù. I/O °ø°£Àº 16 ºñÆ®ÀÇ °ø°£¿¡¼ 16 Áø¼ö·Î ¸»Çϸé 0000h - FFFFh ÀÇ °ø°£ÀÌ´Ù (16 Áø¼ö´Â ¼öÄ¡µÚ¿¡[h] ¸¦ ºÙÀδÙ). ÀÌ °ø°£À¸·Î µ¥ÀÌÅ͸¦ Àü¼Û Çϰųª(¿ÜºÎ Ãâ·Â), µ¥ÀÌÅ͸¦ ¹Þ°Å³ª(¿ÜºÎ ÀÔ·Â) ÇÏ´Â ¹æ½ÄÀ¸·Î , ÁÖº¯ÀåÄ¡¸¦ ¾×¼¼½º ÇÒ ¼ö°¡ ÀÖ´Ù.
À©µµ¿ìÁî¿¡´Â, ¡¸½Ã½ºÅÛ Á¤º¸¡¹¸¦ Ç¥½ÃÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù. ¡¸½ÃÀÛ ¸Þ´º¡¹ÀÇ ¡¸º¸Á¶ÇÁ·Î±×·¥¡¹¾ÈÀÇ ¡¸½Ã½ºÅÛÁ¤º¸¡¹ ÀÌ´Ù.ÀÌ ÇÁ·Î±×·¥À¸·Î, ¾î¶»°Ô I/O °ø°£ÀÌ ÇÒ´çµÇ¾î ÀÖ´ÂÁö¸¦ º¼ ¼ö°¡ ÀÖ´Ù.
ÀÎÅÍ·´Æ®´Â Çϵå¿þ¾î ÀÎÅÍ·´Æ®¿Í ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÇ 2 Á¾·ù°¡ ÀÖ½À´Ï´Ù. Çϵå¿þ¾î ÀÎÅÍ·´Æ®¶õ, ¿ÜºÎ·ÎºÎÅÍ ÀÔ·ÂÀÌ ÀÖ¾úÀ» °æ¿ì, ÇöÀçÀÇ ÇÁ·Î±×·¥À» ÀϽÃÁßÁö ÇÏ°í, º°µµÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â ±â´ÉÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, ÇÁ·Î±×·¥ A¸¦ ½ÇÇàÁß¿¡ Å°º¸µå°¡ ´·È´Ù°í °¡Á¤ ÇսôÙ. ÀÌ °æ¿ì Å°º¸µå°¡ ´·ÁÁø Å°¸¦ ¹öÆÛ¿¡ º¸Á¸ÇØ µÎ¾î¾ß¸¸ ÇÕ´Ï´Ù. °Å±â¼ Çϵå¿þ¾î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇØ Å°º¸µå¹öÆÛ¿¡ °ªÀÌ ÀúÀåµË´Ï´Ù. ¹°·Ð Çϵå¿þ¾î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇϸé , Ç÷¡±×¿Í ·¹Áö½ºÅÍÀÇ °ªÀº ½ºÅÿ¡ ÀúÀåµÇ¹Ç·Î, ¿ø·¡ÀÇ ÇÁ·Î±×·¥¿¡´Â ¾Æ¹«·± ¿µÇâµµ ³¢Ä¡Áö ¾Ê½À´Ï´Ù.
Çϵå¿þ¾î ÀÎÅÍ·´Æ®ÀÇ ¿¹
¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÇ ¿¹
ÀÌ¿Í´Â ´Þ¸®, ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®´Â ÇÁ·Î±×·¥¿¡¼ ¸í½ÃÀûÀ¸·Î MS-DOSÀÇ ÇÔ¼ö È£ÃâÀ̳ª, BIOSÀÇ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.(Áï, ÇÁ·Î±×·¡¸Ó°¡ ¹ß»ý½ÃÅ°´Â ÀÎÅÍ·´Æ®¸¦ ÀǹÌÇÕ´Ï´Ù)
ÇÁ·Î±×·¥ÀÇ ¿¹¸¦ º¸°í ÀÌÇØÇϽñ⠹ٶø´Ï´Ù.
;****************************************************************************** ; ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥ ; ÀÌ ÇÁ·Î±×·¥Àº MS-DOS¿ëÀÇ ÇÁ·Î±×·¥ÀÔ´Ï´Ù ; VC¿¡¼´Â ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù. Âü°í¿ëÀ¸·Î Á¦ÀÛÇÑ °ÍÀÔ´Ï´Ù. ;****************************************************************************** .model small, c ; ¸ðµ¨¿¡¼ small¹®À» ¸ÕÀú ±â·ÏÇÏ°ÔµÇ¸é ¼¼±×¸ÕÆ®(segment)´Â 16 ºñÆ®°¡ µÈ´Ù .286 ;****************************************************************************** ; ÇÁ·Î¼¼½ºÀÇ Á¾·á ¸ÅÅ©·Î ;****************************************************************************** end_process macro ret_value mov al, ret_value mov ah, 4ch int 21h endm ;****************************************************************************** ; ij¸¯ÅÍ ¶óÀÎÀÇ Ç¥½Ã ¸ÅÅ©·Î ;****************************************************************************** display macro string mov dx, offset string mov ah, 09h int 21h endm ;****************************************************************************** ; 1 ij¸¯ÅÍ ÀÔ·Â(¿¡ÄÚ ¾øÀ½) ¸ÅÅ©·Î ; AL = Å°º¸µå·ÎºÎÅÍ ÀÔ·ÂµÈ Ä³¸¯ÅÍ ;****************************************************************************** read_kbd macro mov ah, 08h int 21h endm ;****************************************************************************** ; µ¥ÀÌÅÍ Á¤ÀÇ ;****************************************************************************** .data MSG db 'ÀÌ ÇÁ·Î±×·¥Àº Áï½Ã Á¾·áÇÕ´Ï´Ù', 0dh, 0ah, '$' ;****************************************************************************** ; ½ÇÇà ÇÁ·Î¼¼½º ;****************************************************************************** .code START: mov ax, _DATA mov ds, ax display MSG ; ¸Þ¼¼Áö¸¦ Ç¥½Ã read_kbd ; ¹öÆ° ÀÔ·Â ´ë±â end_process 0 ; ÇÁ·Î±×·¥ÀÇ Á¾·á end START ; end ÀÇ»ç ÀνºÆ®·°¼ÇÀÇ µÚ¿¡´Â ½ºÅ¸Æ® ÁöÁ¡À» ±â¼úÁÖ¼®¿¡¼µµ ¹àÇûµíÀÌ, VC¿¡¼´Â ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù. VCÀÇ ¸µÄ¿´Â 32 ºñÆ®À̹ǷÎ, ÀÌ ÇÁ·Î±×·¥Àº 16 ºñÆ®ÀÇ ¸µÄ¿·Î ¸µÅ© ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. 16 ºñÆ®ÀÇ ¸µÄ¿´Â ¾Æ·¡¿¡¼ ´Ù¿î·Îµå ¹Þ¾Æ¼ »ç¿ëÇϱ⠹ٶø´Ï´Ù.
ftp://ftp.microsoft.com/softlib/mslfiles/lnk563.exe
¾ÐÃàÇØÁ¦Çϸé 16 ºñÆ®ÀÇ ¸µÄ¿°¡ »ý¼ºµË´Ï´Ù. 32 ºñÆ®¿ëÀÇ ¸µÄ¿°¡ ¾Æ´Ï¹Ç·Î ÁÖÀÇÇϱ⠹ٶø´Ï´Ù.
À̹ø ¿¹¿¡¼´Â ¸ÅÅ©·Î Á¤ÀÇÇÏ°í ÀÖ½À´Ï´Ù. ¸ÅÅ©·Î´Â ÇÔ¼ö¿Í ´Þ¸®, È£ÃâµÈ °÷¿¡ ġȯµË´Ï´Ù. "º¹»ç" "ºÙ¿©³Ö±â"¿Í À¯»çÇÕ´Ï´Ù. È£ÃâÀÌ ¾Æ´Ï°í ´ë½Å Äڵ幮ÀÌ ¹Ù·Î ³ªÅ¸³ª°Ô µË´Ï´Ù. À̱â´ÉÀ¸·Î ¸ÅÅ©·Î ¾î¼Àºí¸®¶ó°í ºÒ¸®°Ô µË´Ï´Ù. C++ÀÇ ÀÎ ¶óÀÎ ÇÔ¼ö¿Í °°Àº °ÍÀÔ´Ï´Ù. ¸ÅÅ©·Î´Â º¸¸é ¾Ë ¼ö ÀÖµíÀÌ macro - endm ·Î Á¤Àǵǰí ÀÖ½À´Ï´Ù. ÇÔ¼ö È£Ãâ¿¡ ´ëÇؼ´Â, 16 ºñÆ® ¾î¼Àºí·¯ ÂÊÀ» Âü°í ÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù.
Chapter 2 - 8 ¡¡ BIOS/½Ã½ºÅÛ ÄÝ /VRAM
BIOS ´Â ¸ÞÀκ¸µå¿¡ ÀåÂøµÇ¾î ÀÖ´Â, ·Î¿ì·¹º§·Î Çϵå¿þ¾î Á¶ÀÛÀ» ÇÏ´Â ÇÁ·Î±×·¥ÀÔ´Ï´Ù. BIOS ´Â ¼ÒÇÁÆ®¿þ¾î¶ó°í ºÒ¸®Áö ¾Ê°í Æß ¿þ¾î¶ó°í ºÒ¸®¾î Áý´Ï´Ù. Á÷Á¢ ÇÏµå µð½ºÅ©ÀÇ ¼½ÅÍ¿¡ ±â·ÏÇϰųª ÀоîµéÀ̰ųª Çϴ ó¸®³ª, Ç÷ÎÇÇ µð½ºÅ©ÀÇ Á¶ÀÛµîÀÇ ·Î¿ì·¹º§ ÇÔ¼öµé·Î ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù.Áï, ½ÇÁ¦·Î ÄÄÇ»Å͸¦ ¿òÁ÷ÀÌ´Â °¡Àå ¹ØºÎºÐÀÔ´Ï´Ù.
½Ã½ºÅÛ ÄÝÀ̶õ, BIOS ³ª OS ÀÇ ·Î¿ì·¹º§ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.
VRAM (Video RAM)¿¡´Â, ij¸¯ÅÍ VRAM ¿Í ±×·¡ÇÈ VRAM °¡ ÀÖ½À´Ï´Ù. ij¸¯ÅÍ VRAM ¶õ, ¸Þ¸ð¸®»óÀÇ Ä³¸¯Å͸¦ µð½ºÇ÷¹ÀÌ¿¡ Ç¥½ÃÇÏ´Â RAM ÀÔ´Ï´Ù. ¸Þ¸ð¸®»ó¿¡ Á÷Á¢ ij¸¯Å͸¦ ÀÔ·ÂÇÏ´Â °ÍÀ¸·Î, ȸé»ó¿¡ ij¸¯Å͸¦ µ¿±âÀûÀ¸·Î Ç¥½Ã ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×·¡ÇÈ VRAM ¶õ, ¸Þ¸ð¸®»óÀÇ µ¥ÀÌÅ͸¦ ±×·¡ÇÈÀ¸·Î¼ Ç¥½ÃÇÏ´Â RAM ÀÔ´Ï´Ù. ¸Þ¸ð¸®¿Í ȸéÀÇ ±×·¡ÇÈÀº ¼·Î ´ëÀÀÇÏ°í ÀÖÀ¸¹Ç·Î, ¸Þ¸ð¸®¿¡ ±â·ÏÇÏ´Â °ÍÀ¸·Î, Á÷Á¢±×¸²À̳ª °î¼±°°Àº °´Ã¼µîÀ» ȸ鿡 Ç¥½ÃÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×·¡ÇÈ º¸µåµî¿¡ ÀÖ´Â ·¥¿¡ ÇØ´çÇÕ´Ï´Ù.
´ëºÎºÐÀÇ °æ¿ì ±×·¡ÇÈ VRAM ´Â, A000 : 0000 ¿¡ ÇÒ´çµÇ¾î ÀÖ½À´Ï´Ù.
¿ì¼± Çϵå¿þ¾îÀÇ ±¸Á¶´Â ÀÌ°ÍÀÌ ´Ù ÀÔ´Ï´Ù. ³Ê¹« °£´ÜÇÏ´Ù°í »ý°¢ ÇÏ½Ç °ÍÀÔ´Ï´Ù. À©µµ¿ì ÇÁ·Î±×·¡¹ÖÀ» ÇÏ°Ô µÉ·Á¸é ¸ÕÀú µµ½º³ª ½Ã½ºÅÛ ÇÁ·Î±×·¥¿¡ ´ëÇؼ ¾Ë¾Æ¾ß ÇÕ´Ï´Ù. ¸ðµç°Í¿¡´Â ´Ü°è°¡ ÀÖ½À´Ï´Ù. º» °Á´ »ó¼¼ ¸Å´º¾óÀÌ ¾Æ´Õ´Ï´Ù. ÀÌÀü¿¡ ÇѹøÂëÀº ÀÍÇôº¸¼Ì´ø ³»¿ëÀ» ´Ù½Ã±Ý °£´ÜÈ÷ Á¤¸®ÇÑ °ÍÀÔ´Ï´Ù. ÇÏÁö¸¸ ÇÁ·Î±×·¡¹ÖÀº ¸¹Àº°ÍÀ» ¿ä±¸ÇÏÁö´Â ¾Ê½À´Ï´Ù. °£´ÜÇÑ ¸í·É¾î·Îµµ ÈǸ¢ÇÑ ÇÁ·Î±×·¥À» ÀÛ¼º ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾Ë°í¸®ÁòÀ» ¾ð¾îÀÇ ¹®¹ý¿¡ ¸Â°Ô²û ÀÛ¼ºÇÏ´Â µµ±¸ÀÏ »ÓÀÔ´Ï´Ù.ÀÌ°ÍÀ» ÀÌÇØÇÏÁö ¸øÇÏ°ÔµÇ¸é °¢Á¾ ¾ð¾î¸¦ ¼··ÆÇصµ ¸Ö Çß´ÂÁö ¸ð¸£°ÔµÇ´Â µô·¹¸¶¿¡ ºüÁö°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î¼ ¿µ¾îÀÇ ¹®¹ý¸¸ Àܶà¿Ü¿ì°Ô µÈÈÄ ½ÇÁ¦ ´ëÈ´Â ¸øÇÏ°Ô µÇ´Â°ÍÀ̶û °°½À´Ï´Ù. ¹Ì±¹ÀÇ ²¿¸¶´Â ¹®¹ýÀ» ¹è¿ìÁö ¾Ê½À´Ï´Ù. ¸»ºÎÅÍ ¹è¿ì°í ÀÚ¿¬È÷ ¹®¹ýÀ» ÀÍÇô¼ ¿À·ù¸¦ ÁÙÀÌ°í ¸ÚÁö°Ô Ç¥ÇöÇÏ´Â ¹ýÀ» ¹è¿ì´Â°Í°ú °°Àº ÀÌÄ¡ÀÔ´Ï´Ù. ¾ð¾î´Â µµ±¸ÀÔ´Ï´Ù.¶ó´Â ¸»À» °¢Á¾ °³¹ßÀÚ»çÀÌÆ®¿¡¼ ÇÏ´Â ÀÌÀ¯´Â ÀÌ°ÍÀÔ´Ï´Ù. ¸ðµç°ÍÀ» ¿Ü¿ì·Á ÇÏÁö ¸¶½Ã±æ ¹Ù¶ø´Ï´Ù. ±âº»ÀûÀΰÍÀ» ¹è¿ì½Ã°í È°¿ëÀ» ÇÏ´Ù°¡º¸¸é ¸·È÷´Â ºÎºÐµµ ¹ß»ýÇÏ°í ±×·±ºÎºÐÀ» ÇϳªÇϳª ÀÍÇô°¡½Ã°Ô µÇ¸é¼ ÀÍÈ÷´Â °Ì´Ï´Ù. ¿¡ ¿¡ ¿¡ ¹®¹ý°ú ¾Ë°í¸®ÁòÀ» º¸°ÇϽðԵǰí, ³ªÁß¿¡´Â ÀڽŸ¸ÀÇ ¶óÀ̺귯¸®¿Í °³¹ß¹æ½ÄÀ» ŸÀο¡°Ô ÀüÆĽÃų ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.
±×·¡µµ ¸Õ°¡ ÂòÂòÇÏ´Ù°í »ý°¢ÇϽô ºÐµéÀº ¾î¼Àºí¸® ±âÃÊ°Á¸¦ ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù. ÀÌ¿ª½Ã °Á¸¦ ÇÒ °ÍÀÔ´Ï´Ù.
´ÙÀ½ºÎÅÍ´Â Windows ÇÁ·Î±×·¡¹ÖÀ» ÇÏ°Ô µË´Ï´Ù. ±âÃÊÁö½ÄÀ¸·Î¼´Â, Windows API ¿¡ ´ëÇÑ Áö½ÄÀÌ ÇÊ¿äÇÕ´Ï´Ù¸¸, ³Ê¹« ÀÚ¼¼È÷ ¾Ë·ÁÇϽñâ Àü¿¡ °¡º±°Ô üÇè ÇϽÅÈÄ¿¡ º°µµÀÇ ¼ÀûµîÀ¸·Î °øºÎÇϽñ⠹ٶø´Ï´Ù. MSDNµµ ÈǸ¢ÇÕ´Ï´Ù. ¿©±â¼´Â ÀÚ¼¼ÇÏ°Ô ¼³¸íÇÏÁö´Â ¾Ê½À´Ï´Ù.
Chapter 3 ¡¡ Windows ÇÁ·Î±×·¡¹Ö
°³¿ä : Windows ÇÁ·Î±×·¡¹Ö
Chapter 3 - 1 ¡¡ Windows ÇÁ·Î±×·¡¹Ö
MASMÀ¸·Î Windows ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇغ¸ÀÚ!
±âÃÊÁö½ÄÀ¸·Î Windows API, C ¾ð¾î,CPU µîÀÇ ±âº»Áö½ÄÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·± ºÎºÐ¿¡ ´ëÇؼ´Â º» ¹®¼¿¡¼ ÀÚ¼¼È÷ ¼³¸íÇÏÁö ¾ÊÀ¸¹Ç·Î, °øºÎÇϱ⠹ٶõ´Ù.
Chapter 3 - 2 ¡¡ÃÖÃÊÀÇ ÇÁ·Î±×·¥
MASMÀ¸·Î Windows ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °ÍÀÌÁö¸¸, óÀ½À¸·Î ÀÛ¼ºÇÏ´Â °ÍÀ̶ó¼ ÁÖ¼®À» ´Þ¾Æ µÎ°Ú´Ù.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ¾î¼Àºí·¯ À©µµ¿ìÇÁ·Î±×·¡¹Ö ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .486 .model flat, stdcall ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Á¤ÀÇ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NULL = 0 MB_OK = 0 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; prototype ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MessageBoxA proto :dword, :dword, :dword, :dword ExitProcess proto :dword ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; µ¥ÀÌÅÍ ¼¼±×¸ÕÆ® ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .data MSG1 db '¸Þ¼¼Áö Å×½ºÆ®',0 TITLE1 db 'ŸÀÌƲ', 0 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; code segment ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .code WinMainCRTStartup proc invoke MessageBoxA, NULL, offset MSG1, offset TITLE1, MB_OK invoke ExitProcess, 0 ret WinMainCRTStartup endp endÇϳª¾¿ ¼³¸íÇÏ°Ú´Ù. ¸ÕÀú .486 Áö½Ã¾îÀÌ´Ù. MASM¿¡¼, 486¿ëÀÇ ÀνºÆ®·°¼ÇÀ» »ý¼ºÇÏ´Â Áö½Ã¾îÀÌ´Ù. ¿¹¸¦ µé¾î, .386À¸·Î ÇϰԵǸé, 80386¿ëÀÇ ÀνºÆ®·°¼ÇÀ» »ý¼ºÇÏ°Ô µÈ´Ù. .386p¿Í °°ÀÌ, CPU¸í µÚ¿¡ p¸¦ ºÙÀ̰ԵǸé Ư±Ç ÀνºÆ®·°¼Çµµ »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. (p´Â privilage¡æƯ±ÇÀÇ ¾àÀÚ)
´ÙÀ½À¸·Î .model Áö½Ã¾îÀÌ´Ù. ÀÌ ÀνºÆ®·°¼ÇÀº ¸Þ¸ð¸®¸ðµ¨À̶ó´Â ¸Þ¸ð¸®»ç¿ë ±Ô¾àÀ» Á¤ÇÑ´Ù. Win32 ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â Ç÷§¸Þ¸ð¸®¸ðµ¨¸¸ »ç¿ëÇϱ⠴빮¿¡, ¸Þ¸ð¸®¸ðµ¨¿¡´ÂÇ×»ó flat¸¦ ÁöÁ¤ÇÑ´Ù. ¶ÇÇÑ, ÇÔ¼ö(ÇÁ·Î½ÃÀú)ÀÇ È£Ã⠱Ծ࿡´Â, Windows ÇÁ·Î±×·¥ ¶óÀ̺귯¸®ÀÇ È£Ãâ ±Ô¾àÀÎ stdcallÀ» ÁöÁ¤ÇÑ´Ù.
ÇÁ·Î±×·¥¿¡¼, WinMainCRTStartup¶ó´Â ÇÁ·Î½ÃÀú¸¦ Á¤ÀÇÇÏ°í ÀÖ´Ù. ÇÁ·Î½ÃÀú¸¦ Á¤ÀÇÇÏ·Á¸é , proc Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. ¶Ç, ÇÁ·Î½ÃÀú È£Ãâ¹æ¹ý¿¡´Â, ¿©·¯ °¡Áö°¡ ÀÖÁö¸¸, °£·«ÈµÈ È£Ãâ ¹æ¹ýÀ¸·Î invoke Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù. Invoke¸¸ È£ÃâÇØÁÜÀ¸·Î½á, MASM¿¡¼ ÇÁ·Î½ÃÀú È£ÃâÀ» °£´ÜÇÏ°Ô ¼öÇàÇÒ ¼ö°¡ ÀÖ°Ô µÈ´Ù. º¹ÀâÇÑ ½ºÅÃ󸮸£ ÇØÁְԵȴÙ. À̸í·É¾î¿Í ´Ù¸¥ ¸î°¡Áö·Î ÀÎÇؼ °í±Þ¾ð¾î¿Í ºñ½ÁÇÏ°Ô ÇÁ·Î±×·¥À» ÇÏ°Ô µÉ ¼ö ÀÖ°Ô µÈ´Ù.
Windows ÇÁ·Î±×·¥ÀÇ Á¾·á¿¡´Â, ¹Ýµå½Ã ExitProcess¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. VC++¿¡¼´Â, ³»ºÎÀûÀ¸·Î ExitProcess ¸¦ È£ÃâÇÑ´Ù. ¿Ö ¹Ýµå½Ã È£ÃâÇؾßÇϴ°¡ Çϸé , ExitProcess¸¦ È£ÃâÇÏÁö ¾ÊÀ¸¸é ¿ÏÀüÇÏ°Ô ÇÁ·Î¼¼½º°¡ Á¾·áÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ¸¸¾à È£ÃâÇÏÁö ¾Ê´Â °æ¿ì´Â, ¸Þ¸ð¸®»ó¿¡ ¾²·¹±â°ªÀÌ ³²´Â °æ¿ìµµ ¹ß»ýÇÒ ¼öµµ ÀÖ´Ù.
Chapter 3 - 3 ¡¡ ÀνºÅϽº ÇÚµé
ÀνºÅϽº ÇÚµéÀ̶õ, °¢°¢ÀÇ ¸ðµâÀÇ ½Çü¸¦ ³ªÅ¸³»´Â ÇÚµéÀÌ´Ù.¼±¶æ ÀÌÇØ°¡ µÇÁö ¾ÊÀ»°ÍÀÌ´Ù . Á» ´õ ÀÚ¼¼ÇÏ°Ô ¼³¸íÀ» ÇÏ°Ú´Ù.
Windows¿¡´Â, ¸ðµç ¿ÀºêÁ§Æ®¸¦ "ÇÚµé" ·Î ´Ù·ç°Ô µÈ´Ù. ±×·¸±â ¶§¹®¿¡ Windows¿¡¼, ½ÇÇà ÆÄÀÏÀÌ ¸Þ¸ð¸®»ó¿¡ ·Îµå µÇ¸é, ¾î¶² ÇüÅ·εç ÀÌ"ÀνºÅϽº"¸¦ °ü¸®ÇÏÁö ¾ÊÀ¸¸é ¾È µÇ´Â °ÍÀÌ´Ù. Windows´Â, ¾îÇø®ÄÉÀ̼ÇÀÌ ÀÚ½ÅÀÇ ÀνºÅϽº¿¡ ´ëÇؼ Á¶ÀÛÀ» ¼öÇàÇÒ °æ¿ì "ÀνºÅϽº ÇÚµé"À» ±× °ªÀ¸·Î ³Ñ°ÜÁÖ°Ô µÈ´Ù.(Á¶ÀÛ¿ë ¹øÈ£¶ó°í »ý°¢Çϱ⠹ٶõ´Ù)
±×·±µ¥, ¿Ö ÀνºÅϽº ÇÚµéÀÌ ÇÊ¿äÇÑ°¡ ¸¦ ¼³¸íÇϸé, ½ÇÇàÆÄÀÏ(ȤÀº ¸ðµâ)¿¡ ¼ÓÇØÀÖ´Â ¸®¼Ò½º¸¦ ¾òÀ»·Á°í ÇÏ´Â °æ¿ì¿¡´Â, ÀÌ ÀνºÅϽº ÇÚµéÀ»"Å°"·ÎÇؼ Windows¿¡ ¿äûÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. ÀνºÅϽº ÇÚµéÀÇ Á¸Àç Àǹ̴Â,¾îÂ¸é ´ç¿¬ÇÑ °ÍÀÌ´Ù.
¸ÕÀú, ÇÁ·Î±×·¥À» »ìÆ캸ÀÚ.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ¾î¼Àºí·¯ À©µµ¿ì ÇÁ·Î±×·¡¹Ö ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .586 .model flat, stdcall ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Á¤ÀÇ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NULL = 0 MB_OK = 0 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; prototype ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MessageBoxA proto :dword, :dword, :dword, :dword GetModuleHandleA proto :dword wsprintfA proto c :dword, :dword, :dword ExitProcess proto :dword ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; µ¥ÀÌÅÍ ¼¼±×¸ÕÆ® ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .data MSG1 db 'ÀνºÅϽº ÇÚµé: 0x%X', 0 TITLE1 db 'ŸÀÌƲ ', 0 STR1 db 64 dup(0) hModule dd ? ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; code segment ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .code WinMainCRTStartup proc invoke GetModuleHandleA, NULL mov hModule, eax invoke wsprintfA, offset STR1, offset MSG1, hModule invoke MessageBoxA, NULL, offset STR1, offset TITLE1, MB_OK invoke ExitProcess, 0 ret WinMainCRTStartup endp end½ÇÇà(F5)Çغ¸¸é ¸ðµâÇÚµé ¹øÈ£¸¦ ¸Þ¼¼Áö ¹Ú½º·Î Ç¥½ÃÇØÁØ´Ù. ÄÄÇ»Å͸¶´Ù ´Ù¸¦¼ö ÀÖÀ¸³ª º¸Åë 0x400000Çü½ÄÀÌ´Ù.¸ðµâ ÇÚµéÀ» ¾ò±âÀ§Çؼ´Â GetModuleHandle ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÇÔ¼ö¸í µÚ¿¡ ºÙ¾î ÀÖ´Â AÀÇ Àǹ̴ ¹®ÀÚ¿ÀÌ Ascii ÄÚµå¶ó´Â ÀǹÌÀÌ´Ù. ÇÔ¼ö¸í µÚ°¡ WÀÏ °æ¿ì´Â, ¹®ÀÚ¿ÀÌ UNICODE¶ó´Â ÀǹÌÀÌ´Ù. Âü°í»ï¾Æ ±â¾ïÇØ µÎ±â ¹Ù¶õ´Ù.
(NTÀÇ °æ¿ì´Â ±âº»°ªÀ¸·Î À¯´ÏÄÚµå¹æ½ÄÀÌ´Ù)
WindowsAPI¿¡ ´ëÇؼ´Â, MSDN ¶óÀ̺귯¸®¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.
´ÙÀ½¿¡´Â, ·ÎÄà º¯¼ö¿¡ ´ëÇؼ ¾Ë¾Æº¸ÀÚ.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ¾î¼Àºí·¯ À©µµ¿ì ÇÁ·Î±×·¡¹Ö ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .586 .model flat, stdcall option casemap:none ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Á¤ÀÇ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NULL = 0 MB_OK = 0 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; prototype ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MessageBoxA proto :dword, :dword, :dword, :dword GetModuleHandleA proto :dword wsprintfA proto c :dword, :dword, :dword ExitProcess proto :dword ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; µ¥ÀÌÅÍ ¼¼±×¸ÕÆ® ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .data MSG1 db 'ÀνºÅϽº ÇÚµé: 0x%X', 0 TITLE1 db 'ŸÀÌƲ', 0 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; code segment ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .code WinMainCRTStartup proc ;--------------------------- ; ·ÎÄà º¯¼ö ;--------------------------- local pBuf[64] :byte local hModule :dword ;--------------------------- ; ÇÁ·Î±×·¥ º»Ã¼ ;--------------------------- invoke GetModuleHandleA, NULL mov hModule, eax invoke wsprintfA, addr pBuf, offset MSG1, hModule invoke MessageBoxA, NULL, addr pBuf, offset TITLE1, MB_OK invoke ExitProcess, 0 ret WinMainCRTStartup endp endÇÁ·Î½ÃÀú ³»ºÎ¿¡¼ local Áö½Ã¾î¸¦ »ç¿ëÇÔÀ¸·Î½á, ·ÎÄà º¯¼ö¸¦ »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù. À§¸¦ ¿¹¿¡¼ ¾Ë¼ö ÀÖµíÀÌ, ·ÎÄà º¯¼öÀÇ ¼±¾ðÀº,
local name[] :size¿Í °°ÀÌ ÇÑ´Ù. À§ÀÇ ¿¹¿¡¼´Â ¹è¿À» ÁöÁ¤Çß´Ù. " ÀνºÅϽº ÇÚµé: 0x400000"¶ó´Â °á°ú°¡ ³ª¿À°Ô µÈ´Ù.
ÀÌÁ¦ºÎÅÍ´Â, ½ÇÁ¦·Î À©µµ¿ì¸¦ »ý¼ºÇØ º»´Ù. ÇÁ·Î±×·¥ÀÇ ³»¿ëÀÌ Á» ±æÁö¸¸ õõÈ÷ »ìÆ캸ÀÚ.
;****************************************************************************** ; ¾î¼Àºí·¯ À©µµ¿ì ÇÁ·Î±×·¡¹Ö windows.asm ;****************************************************************************** .586 .model flat, stdcall option casemap:none ;****************************************************************************** ; Á¤ÀÇ ;****************************************************************************** NULL = 0 WM_DESTROY = 2h IDI_APPLICATION = 32512 IDC_ARROW = 32512 WHITE_BRUSH = 0 WS_OVERLAPPED = 00000000h WS_SYSMENU = 00080000h WS_CAPTION = 00C00000h WS_EX_APPWINDOW = 00040000h SW_SHOWNORMAL = 1 CW_USEDEFAULT = 80000000h HANDLE typedef dword LPSTR typedef dword POINT struct x dword ? y dword ? POINT ends WNDCLASS struct style dword ? lpfnWndProc dword ? cbClsExtra dword ? cbWndExtra dword ? hInstance HANDLE ? hIcon HANDLE ? hCursor HANDLE ? hbrBackground HANDLE ? lpszMenuName LPSTR ? lpszClassName LPSTR ? WNDCLASS ends MSG struct hWnd HANDLE ? message dword ? wParam dword ? lParam dword ? time dword ? point POINT <?, ? > MSG ends ;****************************************************************************** ; ÇÁ·Î½ÃÀú Á¤ÀÇ ;****************************************************************************** CreateWindowExA proto dwExStyle :dword, pClassName :LPSTR, pWindowName :LPSTR, dwStyle :dword, x :dword, y :dword, nWidth :dword, nHeight :dword, hWndParent :HANDLE, hMenu :HANDLE, hInstance :HANDLE, pParam :dword RegisterClassA proto pWndClass :dword GetStockObject proto nObject :dword LoadIconA proto hInstance :HANDLE, lpIconName :LPSTR LoadCursorA proto hInstance :HANDLE, lpCurName :LPSTR GetMessageA proto lpMsg :dword, hWnd :HANDLE, nMsgFilMin :dword, nMsgFilMax :dword TranslateMessage proto lpMsg :dword DispatchMessageA proto lpMsg :dword PostQuitMessage proto nExitCode :dword DefWindowProcA proto hWnd :HANDLE, Msg :dword, wParam :dword, lParam :dword GetModuleHandleA proto lpstr :LPSTR ShowWindow proto hWnd :HANDLE, nCmdShow :dword UpdateWindow proto hWnd :HANDLE ExitProcess proto nExitCode :dword ;*****************»ç¿ëÀÚ Á¤ÀÇ*********************** InitInstance proto hInstance :HANDLE CreateMyWindow proto hInstance :HANDLE ;****************************************************************************** ; µ¥ÀÌÅÍ ¼¼±×¸ÕÆ® ;****************************************************************************** .data ClassName db 'FirstWnd', 0 WindowName db 'First Application', 0 ;****************************************************************************** ; code segment ;****************************************************************************** .code ;****************************************************************************** ; ¸ÞÀÎ ÇÔ¼ö ;****************************************************************************** WinMainCRTStartup proc ;************************* ; ·ÎÄà º¯¼ö ;************************* local msg :MSG local hWnd :HANDLE local hInst :HANDLE ;************************* ; ÇÁ·Î±×·¥ ;************************* invoke GetModuleHandleA, NULL mov hInst, eax invoke InitInstance, hInst cmp eax, NULL je ExitProg invoke CreateMyWindow, hInst cmp eax, NULL je ExitProg mov hWnd, eax invoke ShowWindow, hWnd, SW_SHOWNORMAL invoke UpdateWindow, hWnd MSGLOOP: invoke GetMessageA, addr msg, NULL, 0, 0 or eax, eax je ExitProg invoke TranslateMessage, addr msg invoke DispatchMessageA, addr msg jmp MSGLOOP ExitProg: invoke ExitProcess, msg.wParam ret WinMainCRTStartup endp ;****************************************************************************** ; À©µµ¿ì Ŭ·¡½ºÀÇ µî·Ï ;****************************************************************************** InitInstance proc hInstance:HANDLE ;************************* ; ·ÎÄà º¯¼ö ;************************* local wc :WNDCLASS ;************************* ; ÇÁ·Î±×·¥ ;************************* mov wc.style, 0 mov wc.lpfnWndProc, offset MainWndProc mov wc.cbClsExtra, 0 mov wc.cbWndExtra, 0 mov eax, hInstance mov wc.hInstance, eax invoke LoadIconA, NULL, IDI_APPLICATION mov wc.hIcon, eax invoke LoadCursorA, NULL, IDC_ARROW mov wc.hCursor, eax invoke GetStockObject, WHITE_BRUSH mov wc.hbrBackground, eax mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset ClassName invoke RegisterClassA, addr wc ret InitInstance endp ;****************************************************************************** ; À©µµ¿ìÀÇ ÀÛ¼º ;****************************************************************************** CreateMyWindow proc hInstance:HANDLE ;************************* ; ÇÁ·Î±×·¥ ;************************* invoke CreateWindowExA, WS_EX_APPWINDOW, offset ClassName, offset WindowName, WS_SYSMENU or WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 300, 400, NULL, NULL, hInstance, NULL ret CreateMyWindow endp ;****************************************************************************** ; À©µµ¿ì ÇÁ·Î½ÃÀú ;****************************************************************************** MainWndProc proc hWnd:HANDLE, Msg:dword, wParam:dword, lParam:dword .if Msg == WM_DESTROY invoke PostQuitMessage, 0 .else invoke DefWindowProcA, hWnd, Msg, wParam, lParam .endif ret MainWndProc endp end
VC¿¡¼ ½ÇÇà(F5)ÇÏ°Ô µÇ¸é "Line to long"À̶ó°í ¿¡·¯°¡ ³ª¿Ã°ÍÀÌ´Ù. °Á¿¡¼´Â ÆíÀÇ»ó ¿©·¯ÁÙ·Î ÇßÁö¸¸,
CreateWindowExA proto dwExStyle :dword ~ À̺κÐÀ» ¸ðµÎ ÇÑÁÙ¿¡ ºóÄÀ» ÁÙ¿©¼ ÀÛ¼ºÇØÁà¾ßÇÑ´Ù.
ÇÁ·Î±×·¥À» º¸¸é ¾Ë ¼ö ÀÖµíÀÌ, Windows ÇÁ·Î±×·¡¹ÖÀº ÄÚµù·®ÀÌ ¸¹Àº°ÍÀ» ¾Ë ¼ö°¡ ÀÖ´Ù. MASM32¿¡´Â, ÇÊ¿äÇÑ ÇÔ¼ö³ª ±¸Á¶Ã¼ÀÇ Á¤ÀǸ¦ Á¤¸®ÇÑ ÆÄÀÏÀ» Á¦°øÇØ ÁÖ°íÀÖ´Ù. ±×°ÍÀ» »ç¿ëÇϴ°ÍÀÌ ¿©·¯¸ð·Î Æí¸®ÇÒ °ÍÀÌ´Ù.
À§ÀÇ ÇÁ·Î±×·¥¿¡¼´Â, ÆíÀÇ»ó µ¥ÀÌÅÍÇüÀ¸·Î ÇÚµé(HANDLE)°ú ¹®ÀÚ¿(LPSTR)°ú Á¤¼ö·Î ³ª´©°í ÀÖ´Ù.
MASM·Î Windows ÇÁ·Î±×·¡¹ÖÀ» ÇØ º» ¼ÖÁ÷ÇÑ ÀÇ°ßÀ¸·Î´Â MASMÀ¸·Î Windows ÇÁ·Î±×·¡¹ÖÀ» ÇÒ Á¤µµ¶ó¸é, C ·ÎÇÏ´Â ÆíÀÌ ÈξÀ ÆíÇÏ´Ù. C¿Í ºñ±³Çؼ MASMÀ¸·Î ÀÛ¼ºÇß´Ù°í Çؼ Ưº°È÷ »¡¶óÁö´Â°Íµµ ¾Æ´Ï±â ¶§¹®¿¡, ÇÊ¿äÇÑ ºÎºÐ¸¸ MASM ·Î ÀÛ¼ºÇϴ°ÍÀÌ ÁÖµÈ ¸ñÀûÀÏ °ÍÀÌ´Ù. Á» ´õ ½ÉÇÏ°Ô ¸»Çؼ CÀÇ ÀζóÀÎ ¾î¼Àºí·¯¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¾ÐµµÀûÀ¸·Î ÁÁ´Ù.-_-;
Chapter 4 ¡¡ ¸®¼Ò½ºÀÇ ÀÌ¿ë
°³¿ä : ¸®¼Ò½º¸¦ »ç¿ëÇÏ´Â °æ¿ì
Chapter 4 - 1 ¡¡ ¸®¼Ò½ºÀÇ »ç¿ë¹ý
À̹ø¿¡´Â ¸®¼Ò½º¿¡ ´ëÇØ ¼³¸íÇÑ´Ù. C¾ð¾î¿¡¼ Windows ¸®¼Ò½º¸¦ »ç¿ëÇϴ°Ͱú º°´Ù¸¥ Â÷ÀÌÁ¡Àº ¾ø´Ù.
±×·±µ¥, ¸®¼Ò½º¿¡´Â 2 Á¾·ù°¡ ÀÖ´Ù. ³»ºÎ ¸®¼Ò½º/¿ÜºÎ ¸®¼Ò½º¶ó´Â °ÍÀÌ´Ù.(ÇÊÀÚÀÇ »ç°ßÀÌ´Ù)
³»ºÎ ¸®¼Ò½º´Â, ½ÇÇà ÆÄÀÏ¿¡ Æ÷ÇԵǾîÀÖ´Â ¸®¼Ò½ºÀÌ´Ù. ½ÇÇà ÆÄÀÏ¿¡ Æ÷ÇÔÇØ µÎ¸é, ¸®¼Ò½º ·ÎµùÀ» ºü¸£°Ô ÇÒ ¼ö°¡ÀÖ´Ù. ´Ù¸¸, ¸®¼Ò½º°¡ ½ÇÇà ÆÄÀÏ¿¡ Æ÷ÇԵǹǷÎ, ½ÇÇàÆÄÀÏÀÇ Å©±â°¡ Ä¿Áö°Ô µÇ´Â Çö»óÀÌ »ý±ä´Ù. ƯÈ÷ ºñÆ®¸Ê°ú°°Àº °ÍÀº »çÀÌÁî°¡ Å©¹Ç·Î Á¶½ÉÇϱ⠹ٶõ´Ù.
¿ÜºÎ ¸®¼Ò½º´Â, ¹®ÀÚ ±×´ë·Î ½ÇÇà ÆÄÀÏ¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â ¸®¼Ò½º¸¦ ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ½ÇÇàÁß¿¡ ´Ù¸¥ ÆÄÀϷκÎÅÍ ·ÎµåÇϰųª ½º½º·Î ¸¸µé¾îÁÖÁö ¾ÊÀ¸¸é »ç¿ëÇÒ ¼ö°¡ ¾ø´Ù. ±×·± ¸¸Å, ·ÎµùÇÏ´Â ½Ã°£ÀÌ ¼Ò¸ðµÇ°Ô µÈ´Ù.ÇÏÁö¸¸, ¸Þ¸ð¸®ÀÇ È¿À²¼º¿¡¼´Â ´õ ÁÁ´Ù.
Chapter 4 - 2 ¡¡ ÀÎŬ·çµå ÆÄÀÏ
»ó±âÀÇ ¿¹¿¡¼¿Í °°ÀÌ, ÇÔ¼ö¸¦ ÇϳªÇϳª½Ä Á¤ÀÇÇؼ »ç¿ëÇÑ´Ù¸é ¸Å¿ì ¹ø°Å·Ó°Ô µÈ´Ù. ±×·¡¼ MASM32¿¡ Æ÷ÇԵǾîÀÖ´Â ÇÔ¼ö¿Í Á¤¼ö¸¦ Á¤ÀÇÇÑ ÀÎŬ·çµå ÆÄÀÏÀ» »ç¿ëÇÏ°Ô µÈ´Ù. ´ÙÀ½ÀÇ 4°³ÀÇ ÆÄÀÏÀ» ±â¾ïÇØ µÎ¸é Æí¸®ÇÏ´Ù.
- windows.inc À©µµ¿ì°ü·ÃÁ¤¼ö°¡ Á¤ÀǵǾî ÀÖ´Â ÀÎŬ·çµå ÆÄÀÏ
- kernel32.inc Ä¿³ÎÇÔ¼ö(ÄÚ¾î ÇÔ¼ö)°¡ Á¤ÀǵǾî ÀÖ´Â ÆÄÀÏ
- user32.inc À¯ÀúÇÔ¼ö(À¯Àú ÀÎÅÍÆäÀ̽º ÇÔ¼ö)°¡ Á¤ÀǵǾî ÀÖ´Â ÆÄÀÏ
- gdi32.inc GDI ÇÔ¼ö(±×·¡ÇÈ µð¹ÙÀ̽º ÀÎÅÍÆäÀ̽º ÇÔ¼ö)°¡ Á¤ÀǵǾî ÀÖ´Â ÆÄÀÏ
Chapter 4 - 3 ¡¡ ¾ÆÀÌÄÜ°ú ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ »ç¿ëÇÑ ¿¹
½ÇÁ¦·Î ÇÁ·Î±×·¥À» º¸ÀÚ. À̹ø ¿¹¿¡¼ »ç¿ëÇÏ´Â ¸®¼Ò½º´Â ´ÙÀ̾ó·Î±× ¹Ú½º¿Í ¾ÆÀÌÄÜÀÌ´Ù.
;****************************************************************************** ; ¸®¼Ò½º »ç¿ë ÇÁ·Î±×·¥ resource.asm ;****************************************************************************** .486 .model flat, stdcall option casemap:none include <windows.inc> include <kernel32.inc> include <user32.inc> include <gdi32.inc> include <resource.inc> ;¸®¼Ò½º¸¦ »ç¿ëÇϹǷΠ¹Ýµå½Ã ¼±¾ð ;****************************************************************************** ; prototype ;****************************************************************************** DlgProc proto hWnd :HWND, Msg :UINT, wParam :WPARAM, lParam :LPARAM WinMainCRTStartup proto OnCommand proto hWnd :HWND, wParam :WPARAM ;****************************************************************************** ; µ¥ÀÌÅÍ / º¯¼ö ;****************************************************************************** .data MSG1 db "Á¤»óÀûÀ¸·Î Ç¥½ÃµÇ¾ú´Â°¡? ", 0 TITLE1 db "¸®¼Ò½º Å×½ºÆ®", 0 hInst HINSTANCE ? ;****************************************************************************** ; ÄÚµå ;****************************************************************************** .code ;------------------------------------------------------------------------------ ; ´ÙÀ̾ó·Î±× ÇÁ·Î½ÃÀú ;------------------------------------------------------------------------------ DlgProc proc \ hWnd : HWND, Msg : UINT, wParam : WPARAM, lParam : LPARAM .if Msg == WM_INITDIALOG invoke LoadIconA, hInst, IDI_MAINICON invoke SendMessage, hWnd, WM_SETICON, ICON_BIG, eax .elseif Msg == WM_CLOSE invoke EndDialog, hWnd, 0 .elseif Msg == WM_COMMAND invoke OnCommand, hWnd, wParam .else mov eax, FALSE ret .endif mov eax, TRUE ret DlgProc endp ;------------------------------------------------------------------------------ ; Ä¿¸Çµå ó¸® ;------------------------------------------------------------------------------ OnCommand proc \ hWnd : HWND, wParam : WPARAM mov eax, wParam and eax, 0ffffh .if eax == IDOK invoke SendMessage, hWnd, WM_CLOSE, 0, 0 .elseif eax == IDCANCEL invoke MessageBox, hWnd, addr MSG1, addr TITLE1, MB_OK .endif ret OnCommand endp ;------------------------------------------------------------------------------ ; ¸ÞÀÎ ÇÁ·Î½ÃÀú ;------------------------------------------------------------------------------ WinMainCRTStartup proc invoke GetModuleHandle, NULL mov hInst, eax invoke DialogBoxParamA, hInst, IDD_TEST, NULL, addr DlgProc, NULL invoke ExitProcess, 0 ret WinMainCRTStartup endp ;------------------------------------------------------------------------------ ; End of File ;------------------------------------------------------------------------------ end
À§ÀÇ ÇÁ·Î±×·¥À» ¾î¼Àºí(assemble) Çؼ ½ÇÇàÇصµ ´ÙÀ̾ó·Î±× ¹Ú½º´Â Ç¥½ÃµÇÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé, ¾ÆÁ÷ ¸®¼Ò½º¸¦ ¸¸µéÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ Ç¥½Ã Çϱâ À§Çؼ´Â, ¸®¼Ò½º·Î¼ ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù. ¾ÆÀÌÄÜÀ» »ç¿ëÇÑ´Ù¸é, ¾ÆÀÌÄÜ ¸®¼Ò½ºµµ ÇÊ¿äÇÏ´Ù. ¸¸µç ¸®¼Ò½º¸¦ ¸®¼Ò½º ÄÄÆÄÀÏ·¯·Î ÄÄÆÄÀÏ Çؼ ½ÇÇà ÆÄÀÏ¿¡ ÇÔ²² ¸µÅ© ÇØÁÖ¾î¾ß ¸®¼Ò½º¸¦ »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇØÁø´Ù. ´ÙÀ½°ú °°Àº ¸®¼Ò½º¸¦ ¸¸µé¾î º¸ÀÚ.
¸ÕÀú, ´ÙÀ̾ó¾Ë·Î±× ¹Ú½ºÀÌ´Ù.
VC++·Î ÀÛ¼ºÇÏ´Â °æ¿ì¿¡´Â, ´ÙÀ½°ú °°ÀÌ ÇÁ·ÎÆÛƼ¸¦ ¼³Á¤ÇÑ´Ù.
ÇÁ·ÓÆÛƼ ³»¿ë ID IDD_TEST = 101 Style Overlapped Border Thin More Style ¡¸Center¡¹À» üũ ´ÙÀ½Àº, ¾ÆÀÌÄÜÀÌ´Ù, ÇÏÁö¸¸ ÀÌ°ÍÀº ¸¶À½´ë·Î ¸¸µé¾îµµ ÁÁ´Ù. ÀÌ ¿¹Á¦¿¡¼´Â, ´ÙÀ½°ú °°Àº ¾ÆÀÌÄÜÀ» ÁغñÇß´Ù.
»ý¼ºÇÑ ÈÄ ID´Â ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÑ´Ù.
ID IDI_MAINICON = 102 ÀÌÁ¦´Â, resource.inc ÆÄÀÏÀ» ¸¸µç´Ù. ÀÌ ÆÄÀÏ¿¡´Â ¸®¼Ò½ºÀÇ ID¸¦ ÀúÀåÇØ µÐ´Ù.
;****************************************************************************** ; ¸®¼Ò½º IDÁ¤ÀÇ ;****************************************************************************** IDD_TEST = 101 IDI_MAINICON = 102¸¶ÃÆ´Ù¸é, ÇÁ·ÎÁ§Æ®¸¦ ºôµå ÇÏ°í ½ÇÇàÇØÁØ´Ù. ÀÌÁ¦´Â ȸ鿡 ´ÙÀ̾ó·Î±×¹Ú½º°¡ Ç¥½ÃµÇ¾úÀ» °ÍÀÌ´Ù.
Chapter 5 ¡¡ Tips
°³¿ä : ¾à°£ÀÇ Tips
Chapter 5 - 1 ¡¡ ÀÎŬ·çµå ÆÄÀÏÀÇ Á¾·ù
Áö±Ý±îÁö, ´ë·«À̳ª¸¶, MASM·Î À©µµ¿ì ÇÁ·Î±×·¡¹ÖÀ» Á¢ÇØ º¸¾Ò´Ù.
À̹øÀº Á¶±Ý ´Ù¸¥ ¾ê±â·Î ÈÁ¦¸¦ µ¹·Áº¸°Ú´Ù. MASM ´Â ¾î¼Àºí·¯À̴ϱî, ¾îÂ¸é ¾î·Á¿ï °Í °°ÀÌ »ý°¢µÉ ¼öµµ ÀÖÁö¸¸, ½ÇÁ¦·Ð ÀüÇô ¾î·ÆÁö´Â ¾Ê´Ù. ¿ÀÈ÷·Á C ¸¦ Çß´ø ÀûÀÌ ÀÖ´Â »ç¶÷À̶ó¸é, ¾ÆÁÖ ½±°Ô ÀÌÇØ ÇÒ ¼ö°¡ ÀÖÀ» °ÍÀÌ´Ù.
MASM·Î Windows ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °æ¿ì, ÇÔ¼ö¸¦ ¹Ýµå½Ã Á¤ÀÇÇÏÁö ¾ÊÀ¸¸é ¾ÈµÈ´Ù. ±× ÇÔ¼ö¸¦ ¸Å¹ø Á¤ÀÇÇؼ »ç¿ëÇÏ´Â Æíº¸´Ù´Â, ¹Ì¸® Çì´õ ÆÄÀÏ¿¡ ¸ð¾Æ µÎ°í »ç¿ëÇÏ´Â ÆíÀÌ ´õ ÁÁÀ» °ÍÀÌ´Ù.
ÇÏÁö¸¸ ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ ¸¸µé¾î¼ »ç¿ëÇصµ µÇÁö¸¸, MASM32 Çì´õ ÆÄÀÏÀ» »ç¿ëÇϴ°ÍÀÌ ´õÆí¸®ÇÏ´Ù.ÇÙ½ÉÀûÀÎ Çì´õÆÄÀÏÀ» ¼³¸íÇÏ°Ú´Ù.
ÄÚ¾î ÇÔ¼ö±º Include File Çؼ³ windows.inc Windows ÇÁ·Î±×·¡¹Ö¿¡¼ »ç¿ëÇÏ´Â ´ëºÎºÐÀÇ Á¤¼öÀÇ Á¤ÀÇ. kernel32.inc Ä¿³Î(ÄÚ¾î) ÇÔ¼ö. ÇÁ·Î¼¼½º °ü¸®, ÆÄÀÏ Á¶ÀÛµîÀÇ ÇÔ¼ö°¡ Á¤ÀÇ. user32.inc À¯Àú ÇÔ¼ö. À¯Àú ÀÎÅÍÆäÀ̽º ÇÔ¼öÀÇ Á¤ÀÇ. gdi32.inc GDI ÇÔ¼ö. ±×·¡ÇÈ µð¹ÙÀ̽º ÀÎÅÍÆäÀ̽º ÇÔ¼öÀÇ Á¤ÀÇ. advapi32.inc È®Àå ÇÔ¼ö. ¾ÏÈ£È, ½ÃÅ¥¸®Æ¼, ·¹Áö½ºÆ®¸® Á¶ÀÛµîÀÇ ÇÔ¼öÀÇ Á¤ÀÇ. ¼ºê ÇÔ¼ö±º Include File Çؼ³ comctl32.inc Ä¿¸Õ ÄÁÆ®·Ñ comdlg32.inc common dialog d3drm.inc DirectX 3D Retained Mode ddraw.inc DirectX DirectDraw dinput.inc DirectX DirectInput dplayx.inc DirectX DirectPlay dsetup.inc DirectX DirectSetup dsound.inc DirectX DirectSound glaux.inc OpenGL glu32.inc OpenGL imm32.inc IME API lsapi32.inc LS API lz32.inc LZ ¾ÐÃà netapi32.inc NetAPI odbc32.inc ODBC API opengl32.inc OpenGL scrnsavew.inc Screen Saver API setupapi.inc Setup API shell32.inc Shell API tapi32.inc Telephony API wininet.inc Internet API winmm.inc Multi Media API winspool.inc Printer API wsock32.inc WinSock API Á» ´õ ÀÖÁö¸¸, ÀÌ Á¤µµ·Î ¸¸Á·Çϱ⠹ٶõ´Ù.
Chapter 5 - 2 ¡¡ A¿Í WÀÇ ÀÇ¹Ì¿Í ÇÔ¼ö È£Ãâ ±Ô¾à
ÇÔ¼ö¸íÀÇ ³¡¿¡ A ³ª W °¡ ºÙ¾î Àִµ¥ ÀÌ°ÍÀÇ Àǹ̴ ¹«¾ùÀϱî?
½ÇÁ¦·Î ¹®ÀÚ¿À» Unicode·Î ÇÁ·Î±×·¡¹Ö ÇÏ´Â °æ¿ì, W°¡ ºÙ¾î ÀÖ´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. A°¡ ºÙ¾î ÀÖ´Â ÇÔ¼ö´Â, ¹®ÀÚ¿À» ASCII ÄÚµå·Î ÇÁ·Î±×·¡¹Ö ÇÑ´Ù°í °¡Á¤ÇÏ´Â °ÍÀÌ´Ù.
W ´Â Wide ÀÇ WÀ̸ç , A ´Â Ascii (ȤÀº ANSI )ÀÇ A ÀÌ´Ù.(¸Â°ÚÁö?)
MASM·Î Windows ÇÁ·Î±×·¡¹Ö ÇÏ´Â °æ¿ì, È£Ã⠱Ծ࿡´Â C È£Ãâ ±Ô¾à°ú STDCALL ÀÇ È£Ãâ ±Ô¾àÀ» ÀÌ¿ëÇÑ´Ù. ¾à°£ÀÇ Â÷ÀÌÁ¡ÀÌ Á¸ÀçÇÑ´Ù.
VC++ÀÇ °æ¿ì, ÇÔ¼ö´Â C ±Ô¾àÀ¸·Î ÅëÀϵǾî ÀÖ´Ù. ÇÔ¼ö ¼ö½ÄÀڷμ __cdecl°¡ ÀÚµ¿ÀûÀ¸·Î Ãß°¡µÈ´Ù. API ¿¡¼´Â, __stdcall ·Î Á¤Àǵǰí ÀÖ´Ù.(¾ð´õ¹Ù°¡ 2°³ÀÌ´Ù)
½ÇÁ¦·Î WINAPI ³ª CALLBACK ¶ó°í ÇÏ´Â ¼ö½ÄÀÚ´Â __stdcall À̶ó°í Á¤ÀǵǾî ÀÖ´Ù. API ·ÎºÎÅÍ È£ÃâµÇ´Â °ÍÀ» »ý°¢ÇÏ¸é ´ç¿¬ÇÏ´Ù.
C È£Ãâ ±Ô¾à°ú STDCALL È£Ãâ ±Ô¾àÀÇ Â÷ÀÌ´Â, ½ºÅÃÀ» ¿ÀÇÂÇÏ´Â ÃßÃÖ°¡ ´©±¸Àΰ¡¿¡ µû¶ó ´Ù¸£´Ù. C´Â È£ÃâÇÑ Ãø¿¡¼ ½ºÅÃÀ» ¿ÀÇÂÇÏ°í, STDCALL Àº ÇÔ¼öÀÇ ³»ºÎ¿¡¼ ½ºÅÃÀ» ¿ÀÇÂÇÑ´Ù. ´ÙÀ½Àº C ¿Í STDCALL ÀÇ È£Ãâ ±Ô¾àÀÇ ¿ä¾àÀÌ´Ù.
ó¸® C
(__cdecl)STDCALL
(__stdcall)ÇÔ¼ö¸íÀÇ ¼±µÎ¿¡ _ ¸¦ Ãß°¡ ¡Û ¡Û Àμö¸¦ ¿ª¼øÀ¸·Î ½ºÅÿ¡ Ǫ½¬ ¡Û ¡Û Àμö ½ºÅÃÀ» È£ÃâÇÑ Ãø¿¡¼ ¿ÀÇ ¡Û ¡¿ Àμö ½ºÅÃÀ» È£ÃâµÈ Ãø¿¡¼ ¿ÀÇ ¡¿ ¡Û VARARG »ç¿ë°¡´É ¡Û ¡Û ÀÚ¼¼ÇÑ ºÎºÐÀº MASMÀÇ µµ¿ò¸»À» ÂüÁ¶Çϱ⠹ٶõ´Ù.
Chapter 5 - 3 ¡¡ ÇÁ·Î½ÃÀúÀÇ prototype ¼±¾ð
ÇÔ¼ö(ÇÁ·Î½ÃÀú)ÀÇ È£ÃâÀ» ¼öÇàÇÒ °æ¿ì, invoke Áö½Ã¾î¸¦ »ç¿ëÇϸé ÆíÇÏ´Ù.ÇÏÁö¸¸ ¹Ì¸® prototype ¼±¾ðÀ» ¼öÇàÇØ ÁÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ invoke Áö½Ã¾î´Â, ¸í½ÃÀûÀ¸·Î È£Ãâ±Ô¾àÀ» ÁöÁ¤ÇØ ÁÖ¾î¾ß¸¸ »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù.
invoke Áö½Ã¾î´Â, ¸ÅÅ©·Î¿Í ºñ½ÁÇÑ °ÍÀ¸·Î, invoke¸¦ »ç¿ëÇÏ´Â ÆíÀÌ ÇÔ¼öÈ£ÃâÀÌ ´õ ¼ö¿ùÇØÁø´Ù. ½ºÅà 󸮸¦ ÀÚµ¿È ÇØÁֱ⠶§¹®ÀÌ´Ù.
¶ÇÇÑ, addr ¿Í offset ´Â ¸ðµÎ º¯¼ö ȤÀº Á¤¼öÀÇ ÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù.Â÷ÀÌÁ¡À¸·Î´Â,
offset Áö½Ã¾î¸¸À¸·Î ÇÁ·Î±×·¡¹ÖÇÒ·Á¸é, »ó´çÇÑ Èûµç°æ¿ì°¡ ÀÖ´Ù. offsetÁö½Ã¾î´Â, ½ÇÇà½ÃÀÇ ½ºÅÃÁÖ¼Ò¸¦ ¾òÀ»¼ö ¾ø±â¶§¹®ÀÌ´Ù.À̸§ ±×´ë·Î, offset Àº ½Äº°ÀÚÀÇ ¿ÀÇÁ¼Â(offset)ÁÖ¼Ò¸¦ ±¸ÇØÁØ´Ù.
addr¸¦ »ç¿ëÇÔÀ¸·Î½á , ½ÇÇà½ÃÀÇ ½ºÅú¯¼öÀÇ ÁÖ¼Ò¸¦ ¾òÀ» ¼ö°¡ ÀÖ´Ù.
ÇÑ°¡Áö ÁÖÀÇÇÒ °ÍÀÌ, NULL = 0 ȤÀº, '\0' = 0 ¾Æ´Ï´Ù. È®½ÇÈ÷, Çì´õÆÄÀÏÀ» º¸¸é, NULL = 0 À¸·Î Á¤ÀǵǾî ÀÖ´Ù. ±×·¯³ª ±×°ÍÀº ÆíÀÇ»ó Á¤ÀǵȰÍÀ̹ǷÎ, ÀǹÌÀûÀ¸·Î´Â ´Ù¸£´Ù. Ȥ½Ã ´Ù¸¥ °³¹ßȯ°æ¿¡´Â NULL = -1 ¶ó°í Á¤ÀǵǾî ÀÖÀ»Áöµµ ¸ð¸¥´Ù.
Æ÷ÀÎÅͳª ÇÚµéµîÀÌ Á¤ÇØÁöÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â, ¹Ýµå½Ã NULL À» »ç¿ëÇϵµ·Ï ÇÑ´Ù. Windows ·ÎºÎÅÍ ±¸ÇØÁö´Â ¸ðµç ÇÚµéÀº, ½ÇÁ¦·Î (void *) ÇüÅÂÀ̹ǷΠNULLÀ» »ç¿ëÇÏ´Â ÀÌÀ¯¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¶Ç´Ù½Ã , C ¾ð¾î À̾߱â·Î µÇ¾úÁö¸¸, '\0'´Â ¹®ÀÚ¿ÀÇ ³¡À» ³ªÅ¸³»´Â ±âÈ£»ó¼öÀ̹ǷÎ, ¹®ÀÚ¿ ¿Ü¿¡¼ »ç¿ëÇؼ´Â ¾ÈµÈ´Ù. NULLµµ °°ÀÌ ¸Æ¶ôÀ¸·Î Á¤ÇØÁø ¿ëµµ ÀÌ¿Ü¿¡´Â »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù.
Windows ÇÁ·Î±×·¥À» Á¾·áÇÒ °æ¿ì¿¡´Â ¹Ýµå½Ã, ExitProcess¸¦ È£ÃâÇϵµ·Ï ÇÏÀÚ. ¹°·Ð, »ç¿ëÇÏÁö ¾Ê¾Æµµ ÇÁ·Î±×·¥À» Á¾·áÇÒ ¼ö ÀÖ´Ù.
ÇÏÁö¸¸, DLLÀ» È£ÃâÇßÀ» °æ¿ì, ExitProcess¸¦ »ç¿ëÇÏÁö ¾Ê°í ÇÁ·Î¼¼½º¸¦ Á¾·áÇϸé, ÇÁ·Î¼¼½º¿¡¼ ·ÎµùµÈ DLLÀÌ ¸Þ¸ð¸®¿¡ ³²°ÔµÈ´Ù. ExitProcess¸¦ È£ÃâÇϹǷνá, DLL¿¡ ÇÁ·Î±×·¥ÀÌ Á¾·áÇÏ´Â °ÍÀ» Àü´ÞµÇ°í, DLLµµ ¸Þ¸ð¸®¿¡¼ ÇØÁ¦µÈ´Ù.
Chapter 6 ¡¡ ÅؽºÆ®ºä¾î
°³¿ä : ÅؽºÆ®ºä¾î ÀÛ¼º
Chapter 6 - 1 ¡¡ ÅؽºÆ®ºä¾î ÇÁ·Î±×·¥
Áö±Ý±îÁöÀÇ ´ÜÆíµÈ Áö½ÄÀ» ÀÌ¿ëÇؼ, À̹ø¿¡´Â Á» ´õ ½Ç¿ëÀûÀÎ(??) ÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ. ½Ç¿ëÀûÀ̶óÁö¸¸ ´Ü¼øÈ÷ ÅؽºÆ® ÆÄÀÏÀ» ¿°í ȸ鿡 ³»¿ëÀ» Ç¥½ÃÇÏ´Â ´Ü¼øÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. APIµîÀÇ Áö½ÄÀº MSDNÀ̳ª ±âŸÂüÁ¶¸¦ Çϱ⠹ٶõ´Ù.
¸¸µå´Â ¹æ¹ýÀº ¾ÆÁÖ °£´ÜÇÏ´Ù. À©µµ¿ìÀÇ ÀÛ¾÷¿µ¿ª¿¡ ¿¡µðÆ®¹Ú½º¸¦ »ý¼ºÇÏ¸é ³¡ÀÌ´Ù.
½ÇÁ¦·Î, WM_CREATE ¸Þ¼¼Áö¿¡¼,ÀÛ¾÷¿µ¿ª¿¡ ¿¡µðÆ®¹Ú½º¸¦ »ý¼ºÇØÁÖ¸é µÈ´Ù. ±×¸²À¸·Î Ç¥½ÃÇÏ¸é ´ÙÀ½°ú °°´Ù.
ÆÄÀÏÀ» ¿©´Â ±â´É¸¸ ¼öÇàÇÏ¿©, ÆÄÀÏÀÇ ³»¿ëÀ» º¼¼ö ÀÖµµ·Ï¸¸ ÇÑ´Ù.
ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°´Ù.¡¡¡æ¡¡ÇÁ·ÎÁ§Æ®(VC++¿ë)
; -------------------------------------------------------------------- ; ; Text Viewer main.asm ; ; -------------------------------------------------------------------- .586 .model flat, stdcall option casemap:none include <windows.inc> include <kernel32.inc> include <user32.inc> include <gdi32.inc> include <comdlg32.inc> include <resource.inc> ; -------------------------------------------------------------------- ; ; Procedure Definitions ; ; -------------------------------------------------------------------- InitInstance proto hInstance :HINSTANCE CreateMyWindow proto hInstance :HINSTANCE OnCreate proto hWnd :HWND OnSize proto hWnd :HWND OnCommand proto hWnd :HWND, id :UINT OnFileOpen proto hWnd :HWND ; -------------------------------------------------------------------- ; ; Data ; ; -------------------------------------------------------------------- .data CLASSNAME DB 'FirstWnd', 0 TCLASSNAME DB 'EDIT', 0 APPNAME DB 'ÅؽºÆ®ºä¾î', 0 FILTER DB 'ÅؽºÆ® ÆÄÀÏ (*. txt)', 0, '*. txt', 0 DB '¿öµå ÆÄÀÏ (*. doc)', 0, '*. doc', 0, 0 g_hEditWnd HWND NULL g_szFile DB 260 DUP (0) ; -------------------------------------------------------------------- ; ; Code ; ; -------------------------------------------------------------------- .code ;****************************************************************************** ; ¸ÞÀÎ ÇÔ¼ö ;****************************************************************************** WinMainCRTStartup proc local msg :MSG local hWnd :HWND local hInst :HINSTANCE invoke GetModuleHandleA, NULL mov hInst, eax invoke InitInstance, hInst cmp eax, NULL je _Exit invoke CreateMyWindow, hInst cmp eax, NULL je _Exit mov hWnd, eax invoke ShowWindow, hWnd, SW_SHOWNORMAL invoke UpdateWindow, hWnd _MsgLoop: invoke GetMessageA, addr msg, NULL, 0, 0 or eax, eax je _Exit invoke TranslateMessage, addr msg invoke DispatchMessageA, addr msg jmp _MsgLoop _Exit: invoke ExitProcess, msg.wParam ret WinMainCRTStartup endp ;****************************************************************************** ; À©µµ¿ì Ŭ·¡½ºÀÇ µî·Ï ; ; ATOM InitInstance hInstance:HISNTANCE ;****************************************************************************** InitInstance proc \ hInstance :HINSTANCE local wc :WNDCLASS mov wc.style, 0 mov wc.lpfnWndProc, offset MainWndProc mov wc.cbClsExtra, 0 mov wc.cbWndExtra, 0 mov eax, hInstance mov wc.hInstance, eax invoke LoadIconA, hInstance, IDI_MAIN_ICON mov wc.hIcon, eax invoke LoadCursorA, NULL, IDC_ARROW mov wc.hCursor, eax invoke GetStockObject, WHITE_BRUSH mov wc.hbrBackground, eax mov wc.lpszMenuName, IDR_MAIN_MENU mov wc.lpszClassName, offset CLASSNAME invoke RegisterClassA, addr wc ret InitInstance endp ;****************************************************************************** ; À©µµ¿ìÀÇ ÀÛ¼º ; ; HWND CreateMyWindow hInstance:HINSTANCE ;****************************************************************************** CreateMyWindow proc \ hInstance :HINSTANCE invoke CreateWindowExA, WS_EX_APPWINDOW, offset CLASSNAME, offset APPNAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ret CreateMyWindow endp ;****************************************************************************** ; À©µµ¿ì ÇÁ·Î½ÃÀú ; ; LRESULT MainWndProc hWnd:HWND, Msg:DWORD, wParam:DWORD, lParam:DWORD ;****************************************************************************** MainWndProc proc \ hWnd :HWND, Msg :DWORD, wParam :DWORD, lParam :DWORD .if Msg == WM_DESTROY invoke PostQuitMessage, 0 .elseif Msg == WM_CREATE invoke OnCreate, hWnd .elseif Msg == WM_SIZE invoke OnSize, hWnd .elseif Msg == WM_COMMAND mov eax, wParam and eax, 0000FFFFh invoke OnCommand, hWnd, eax .else invoke DefWindowProcA, hWnd, Msg, wParam, lParam ret .endif mov eax, 0 ret MainWndProc endp ;****************************************************************************** ; WM_CREATE ¸Þ¼¼ÁöÀÇ Ã³¸® ; ; BOOL OnCreate hWnd : HWND ;****************************************************************************** OnCreate proc \ hParentWnd :HWND local hInst :HINSTANCE local rc :RECT invoke GetModuleHandle, NULL mov hInst, eax invoke GetClientRect, hParentWnd, addr rc invoke CreateWindowExA, WS_EX_CLIENTEDGE, offset TCLASSNAME, NULL, WS_VISIBLE or WS_CHILD or ES_MULTILINE or ES_AUTOHSCROLL \ or ES_AUTOVSCROLL or WS_HSCROLL or WS_VSCROLL, 0, 0, rc.right, rc.bottom, hParentWnd, NULL, hInst, NULL mov g_hEditWnd, eax invoke SendMessage, g_hEditWnd, EM_SETLIMITTEXT, 0FFFFh, 0 mov eax, TRUE ret OnCreate endp ;****************************************************************************** ; WM_SIZE ¸Þ¼¼ÁöÀÇ Ã³¸® ; ; void OnSize hWnd :HWND ;****************************************************************************** OnSize proc \ hWnd :HWND local rc :RECT invoke GetClientRect, hWnd, addr rc invoke SetWindowPos, g_hEditWnd, NULL, 0, 0, rc.right, rc.bottom, SWP_NOMOVE or SWP_NOZORDER ret OnSize endp ;****************************************************************************** ; WM_COMMAND ¸Þ¼¼ÁöÀÇ Ã³¸® ; ; void OnCommand hWnd:HWND, id:UINT ;****************************************************************************** OnCommand proc \ hWnd :HWND, id :UINT .if id == IDM_EXIT invoke SendMessage, hWnd, WM_CLOSE, 0, 0 .elseif id == IDM_FOPEN invoke OnFileOpen, hWnd .endif ret OnCommand endp ;****************************************************************************** ; IDM_FOPEN ¸Þ´º ¸Þ¼¼ÁöÀÇ Ã³¸® ; ; void OnFileOpen hWnd:HWND ;****************************************************************************** OnFileOpen proc \ hWnd :HWND local ofn :OPENFILENAME local hFile :HANDLE local pBuffer :DWORD local dwRead :DWORD ; ÆÄÀÏ ¿ÀÇ ´ÙÀ̾ó·Î±× Ç¥½Ã invoke RtlZeroMemory, addr ofn, sizeof OPENFILENAME mov ofn.lStructSize, sizeof OPENFILENAME mov eax, hWnd mov ofn.hWndOwner, eax mov ofn.lpstrFile, offset g_szFile mov ofn.nMaxFile, 260 mov ofn.lpstrFilter, offset FILTER mov ofn.nFilterIndex, 1 mov ofn.lpstrFileTitle, NULL mov ofn.nMaxFileTitle, 0 mov ofn.lpstrInitialDir, NULL mov ofn.Flags, OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST \ or OFN_HIDEREADONLY invoke GetOpenFileName, addr ofn or eax, eax je _OnFileExit ; ÆÄÀÏÀ» ¿¬´Ù invoke CreateFile, ofn.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL mov hFile, eax ; µ¥ÀÌÅÍ¿ë ¹öÆÛÀÇ È®º¸ invoke GlobalAlloc, GPTR, 0FFFFh mov pBuffer, eax ; µ¥ÀÌÅÍÀÇ Çؼ® invoke ReadFile, hFile, pBuffer, 0FFFFh, addr dwRead, NULL ; µ¥ÀÌÅÍÀÇ ±â·Ï invoke SetWindowText, g_hEditWnd, pBuffer ; ¹öÆÛ¸¦ »èÁ¦ invoke GlobalFree, pBuffer ; ÆÄÀÏ ÇÚµéÀ» ´Ý´Â´Ù invoke CloseHandle, hFile _OnFileExit: ret OnFileOpen endp endÆÄÀÏÀ» ¼±ÅÃÇÏ´Â ±â´ÉÀº, common dialogÀÇ ÆÄÀÏ ¿ÀÇ ´ÙÀ̾ó·Î±×¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. ÀÌ°ÍÀ» »ç¿ëÇÏ´Â °ÍÀ¸·Î, ¾ÆÁÖ ½±°Ô ÆÄÀϼ±ÅÃÀ» ÇÒ ¼ö°¡ ÀÖ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ÇÁ·Î±×·¥À» ÂüÁ¶Çϱ⠹ٶõ´Ù.
ºôµå ÇÒ ¶§ÀÇ ÁÖÀÇ »çÇ×À¸·Î´Â, common dialog ¹Ú½º¸¦ »ç¿ëÇϹǷÎ, common dialog ¹Ú½º¸¦ »ç¿ëÇϱâ À§Çؼ´Â, common dialog ¹Ú½ºÀÇ µ¿Àû ¸µÅ© ¶óÀ̺귯¸®(DLL)ÀÇ ¶óÀ̺귯¸®¸¦ ¸µÅ© ÇØÁÖ¾î¾ß ÇÑ´Ù. (commlib.lib ?ºÎºÐ ÂüÁ¶ )
Chapter 7 ¡¡ FPU·Î ¼öÄ¡ ¿¬»ê
°³¿ä : ºÎµ¿ ¼Ò¼öÁ¡ ¿¬»ê¿¡ ´ëÇØ
Chapter 7 - 1 ¡¡ ºÎµ¿ ¼Ò¼öÁ¡ ¿¬»ê¿¡ ´ëÇØ
FPU¸¦(Float Point Unit) ÀÌ¿ëÇÑ ºÎµ¿ ¼Ò¼öÁ¡ ¿¬»ê¿¡ ´ëÇØ, ¼³¸íÀ» ÇÑ´Ù. ÅëÇÕ È¯°æÀ¸·Î´Â VC++ ¸¦ »ç¿ëÇÏÁö¸¸,±»ÀÌ VC++°¡ ¾Æ´Ï¿©µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ °è»ê ÀνºÆ®·°¼Ç¿¡ ´ëÇؼµµ, º» ¼³¸í¼¿¡¼ ÀÚ¼¼È÷ ¼³¸íÇÏÁö ¾Ê´Â´Ù. ÀÎÅÚ ¸Þ´º¾óÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.
À̱ÛÀ» º¸°í ÀÖ´Â »ç¶÷Àº, FPUÀÇ ±â´ÉÀ» ¸ð¸£´Â »ç¶÷Àº ¾ø´Ù´Â °¡Á¤ÀÌ´Ù. FPU´Â, ºÎµ¿ ¼Ò¼öÁ¡ ¿¬»ê¿ëÀ» Çϱâ À§ÇÑ Àü¿ë À¯´ÖÀÌ´Ù. 80386 CPU ±îÁö´Â ¿É¼Ç»çÇ×ÀÌ ¿´Áö¸¸, 80486ºÎÅʹ ǥÁØÀ¸·Î CPU³»ºÎ¿¡ ÀåÂøµÇ¾î ÀÖ´Ù.
(80486SX´Â ¿¹¿Ü)
FPU¿¡´Â, ¸î°³ÀÇ ·¹Áö½ºÅÍ¿Í Àü¿ë ÀνºÆ®·°¼ÇÀÌ Á¸ÀçÇÑ´Ù. °è»ê¿ë ·¹Áö½ºÅÍ·Î 8°³ÀÇ ½ºÅßÀÔÀÇ ·¹Áö½ºÅÍ°¡ ÀåÂøµÇ¾îÀÖ´Ù. °è»ê ÀνºÆ®·°¼Ç¿¡´Â, °¡°¨½ÂÁ¦, ÃÊ¿ùÇÔ¼ö, »ï°¢ÇÔ¼ö µî ¼öÄ¡ °è»ê¿¡ ÇÊ¿äÇÑ ±â´ÉÀº ´ëºÎºÐ Á¦°øµÇ¾î ÀÖ´Ù.
Chapter 7 - 2 ¡¡ FPU¿ë ·¹Áö½ºÅÍ
ºÎµ¿ ¼Ò¼öÁ¡ °è»ê¿ëÀÇ ·¹Áö½ºÅÍ·Î 8°³ÀÇ ·¹Áö½ºÅÍ°¡ ÁغñµÇ¾î ÀÖ´Ù. ÇÏÁö¸¸, ¿Ö ½ºÅÃÇü½ÄÀÇ ·¹Áö½ºÅÍÀϱî?
½ÇÁ¦·Î °è»êÀ» ÇÏ·Á¸é ½ºÅÃÀ» »ç¿ëÇÏ´Â °ÍÀÌ ¿©·¯¸ð·Î ÆíÇÏ´Ù. ÀÌ°ÍÀº ¾Ë°í¸®ÁòÃ¥µî¿¡¼ ½ºÅÃÀ» ÀÌ¿ëÇØ °è»êÇϴ°ÍÀ» º»»ç¶÷µµ ÀÖÀ»°ÍÀÌ´Ù.
½ÇÁ¦·Î ¿ªÆú·£µå ±â¹ýÀÇ °è»ê¹ýÀ¸·Î ÇÁ·Î±×·¡¹Ö ÇÒ°ÍÀÌ´Ù. ±×·¯¹Ç·Î ·¹Áö½ºÅÍ°¡ ¸î°³ ÀÖ´ÂÁö¸¦ ÀǽÄÇÏÁö ¾Ê¾Æµµ, ÇÁ·Î±×·¡¹ÖÀ» ÇØ ³ª°¥ ¼ö°¡ ÀÖ´Ù. (¹°·Ð 8°³¸¦ ³Ñ°Ü¼ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °æ¿ì¿¡´Â, ¹®Á¦°¡ ÀÖ´Ù) ÀÌ·± ¹æ½ÄÀº , ½ºÅÿ¡ µ¶¸³ÀûÀ¸·Î µ¥ÀÌÅ͸¦ ÀоîµéÀÌ°í,, ¿ªÆú·£µå½ÄÀÇ °è»ê¹æ¹ýÀ» ¹«½ÃÇÏ°í °è»êÇϸé, FPU¸¦ »ç¿ëÇÏ´Â °Í±â´É¿¡µµ ºÒ±¸ÇÏ°í ´Ê¾îÁö´Â ÀÏÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÁÖÀÇ°¡ ÇÊ¿äÇÏ´Ù.
°è»ê½Ã¿¡ ƯÁ¤½ºÅÃÀ» ´Ù·ç°í ½ÍÀº °æ¿ì´Â, st(n)¶ó´Â Ç¥±â¹ýÀ» »ç¿ëÇÑ´Ù. n ¿¡´Â, ÇöÀ罺ÅÃÀ¸·ÎºÎÅÍ n ¹ø°ÀÇ ½ºÅÃÀ» ÁöÁ¤ÇÑ´Ù. ¿¹¸¦ µé¸é, ÇöÀç ½ºÅà žÀ¸·ÎºÎÅÍ ÇÑ´Ü°èÀüÀÇ ½ºÅó»¿ëÀ» ÂüÁ¶ÇÏ°í ½ÍÀº °æ¿ì¿¡´Â, st(1)·Î »ç¿ëÇÑ´Ù. 2°³ÀüÀ̶ó¸é st(2)·Î ÇÑ´Ù.
´Ù¸¸, ¹Ì»ç¿ë¿µ¿ªÀÇ ½ºÅÿ¡ ¾×¼¼½º ÇÏ°ÔµÇ¸é ¿¡·¯°¡ µÈ´Ù.
Chapter 7 - 3 ¡¡ ÇÁ·Î±×·¡¹ÖÀÇ ¹æ¹ý
½ÇÁ¦·Î, ¾Æ·¡¿Í °°Àº °è»êÀ» ¼öÇàÇغ¸ÀÚ.
( 5.98 + 34.89 ) * (34.89 - 23.0)ÀÌ °è»êÀ» ½ÇÁ¦·Î ºÎµ¿ ¼Ò¼öÁ¡ ÀνºÆ®·°¼ÇÀ» ÀÌ¿ëÇؼ ÇÁ·Î±×·¡¹ÖÇϸé, ´ÙÀ½°ú °°´Ù.
; _a = 5.98, _b = 34.89, _c = 23.0 À¸·Î ÇÑ´Ù fld _a ; ¨çFPU½ºÅÿ¡ _a ÀÇ °ªÀ» Ǫ½¬ fadd _b ; ¨èÇöÀ罺ÅÃÀÇ °ª°ú _b ÀÇ °ªÀ» ´õÇÑ´Ù fld _b ; ¨éFPU½ºÅÿ¡ _b ÀÇ °ªÀ» Ǫ½¬ fsub _c ; ¨êÇöÀ罺ÅÃÀÇ °ªÀ¸·ÎºÎÅÍ _c ÀÇ °ªÀ» »«´Ù fmul ; ¨ëÇöÀ罺Åðú ÇÑ´Ü°èÀüÀÇ ½ºÅðªÀ» °öÇؼ ÇÑ´Ü°èÀüÀÇ ½ºÅÿ¡ Ǫ½¬ÀÌ·± °è»êÀ» ÇÒ °æ¿ì, ½ºÅÿ¡ ½ÇÁ¦·Î ¾î¶»°Ô µ¥ÀÌÅÍ°¡ ½ÎÀÌ´ÂÁö ¾Ë¾Æº¸ÀÚ.½ºÅÃÀº ´ÙÀ½°ú °°ÀÌ ¿î¿ëµÈ´Ù.
Chapter 7 - 4 ¡¡ ½ÇÁ¦ ÇÁ·Î±×·¡¹Ö
±×·¸´Ù¸é, ½ÇÁ¦·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸ÀÚ. ¼öÄ¡ ¿¬»êÀÇ ºÎºÐÀ» MASM·Î ÀÛ¼ºÇÏ°í, C¾ð¾î·Î ±× ¿¬»êÀ» È£ÃâÇÏ´Â ÇüÅ·ΠÀÛ¼ºÇÑ´Ù. ¸ÕÀú C¾ð¾îÀÇ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°´Ù.
#include <stdio.h> #ifdef __cplusplus extern "C" double func(double a, double b, double c); #endif int main() { printf("func() = %f\n", func(5.98, 34.89, 23.0)); return 0; }func¶ó°í ÇÏ´Â ÇÔ¼ö´Â MASM·Î ÀÛ¼ºÇÑ´Ù. funcÇÔ¼öÀÇ ³»¿ëÀº ´ÙÀ½°ú °°´Ù.
.586 .model flat, c .code func proc \ _a: real8, _b: real8, _c: real8 fld _a fadd _b fld _b fsub _c fmul ret func endp endÇÔ¼öÀÇ ¹Ýȯ°ªÀº, ½ºÅÃÀÇ Å¾¿¡ ³Ö¾î µÐ´Ù.
¿¹¸¦ µé¾î¼ ´ÙÀ½°ú °°Àº ¼ö½ÄÀ» ÇÁ·Î±×·¡¹ÖÇغ¸ÀÚ.
(1) a * (b + c) (2) |a + b| * sin(c) (3) a * ¡î(a + b) * cos(c)°¢°¢ ´ÙÀ½°ú °°ÀÌ µÈ´Ù.
; (1) a * (b + c) fld a fld b fadd c fmul ; (2) |a + b| * sin(c) fld a fadd b fabs fld c fsin fmul ; (3) a * ¡î(a + b) * cos(c) fld a fld a fadd b fsqrt fld c fcos fmul fmulºÎµ¿ ¼Ò¼öÁ¡ °è»êÀº ÀÌ·±½ÄÀÌ´Ù. Å©°Ô ¾î·ÆÁö ¾Ê´Ù. ºÎµ¿ ¼Ò¼öÁ¡ ¿¬»êÀÇ ¿¡·¯ 󸮴Â, ÀÎÅÚ ¸Þ´º¾óÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.
Chapter 8 ¡¡ MMXÀÇ SIMD ¿¬»ê
°³¿ä : MMX¸¦ »ç¿ë
Chapter 8 - 1 ¡¡ MMX ¿¬»êÀÇ °³¿ä
¡áMMX¶õ?
¸ÕÀú MMX ¸í·É¿¡ ´ëÇØ ¼³¸íÇÑ´Ù.
MMX¶õ, ´Ü¼øÇÑ µ¥ÀÌÅÍ ¿ä¼Ò·ÎºÎÅÍ ´ë±Ô¸ð ¹è¿¿¡ ´ëÇÑ ¹Ýº¹ ¿¬»êÀ» ¼öÇàÇÑ´Ù. ¿ëµµ·Î´Â, µ¿¿µ»ó, ±×·¡ÇÈ, ºñµð¿ÀÀÇ °áÇÕ, È»ó ó¸®, ¿Àµð¿À ÇÕ¼º, À½¼º ÇÕ¼º, ¾ÐÃàµîÀÌ ÀÖ´Ù.
¸»ÀÌ ¾î·Á¿ï °ÍÀÌ´Ù. ½ÇÁ¦·Î »ùÇà ÇÁ·Î±×·¥À» VC++·Î ÀÛ¼ºÇؼ ¾Ë¾Æº¸ÀÚ.
¡áMMX ÀνºÆ®·°¼ÇÀÇ °³¿ä
MMX ÀνºÆ®·°¼ÇÀº, SIMD (Single Instruction , Multiple - Data) ½ÇÇà ¸ðµ¨À̶ó´Â ÇüŸ¦ ÃëÇÑ´Ù. ¹«½¼ ¸»Àΰ¡Çϸé, ÇϳªÀÇ ÀνºÆ®·°¼ÇÀ¸·Î º¹¼öÀÇ µ¥ÀÌÅ͸¦ Çѹø¿¡ °è»êÇÑ´Ù´Â °ÍÀÌ´Ù.
¹è¿ char A[8] °ú char B[8] ¶ó´Â ¹è¿ÀÌ ÀÖ¾ú´Ù°í °¡Á¤ÇÏÀÚ.¹è¿ ÇÑ°³ÀÇ ¿ä¼Ò¸¦ MMX ÀνºÆ®·°¼ÇÀ» »ç¿ëÇϸé Çѹø¿¡ °è»ê ÇÒ ¼ö°¡ ÀÖ´Ù. ±×¸²À¸·Î ¼³¸íÇÏ¸é ´ÙÀ½°ú °°´Ù.
À§ÀÇ ¿¹¿¡¼ ¾Ë ¼ö ÀÖµíÀÌ ÇϳªÀÇ ÀνºÆ®·°¼ÇÀ¸·Î Çѹø¿¡ º´·Ä ¿¬»êÀ» ¼öÇàÇÏ°Ô µÈ´Ù. ÀÌ·±½ÄÀ¸·Î È»ó 󸮳ª ¿Àµð¿À ÇÕ¼º, À½¼º ÇÕ¼ºÀÇ Ã³¸® ´É·ÂÀ» Å©°Ô Çâ»ó½Ãų ¼ö°¡ ÀÖ´Ù.
MMX´Â, 8 °³ÀÇ 64 ºñÆ® MMX ·¹Áö½ºÅÍ (MM0, MM1, ... MM7)¸¦ °¡Áö°í ÀÖ´Ù. MMX·¹Áö½ºÅÍ´Â, 8°³ÀÇ FPU ·¹Áö½ºÅ͸¦ °øÀ¯Çؼ »ç¿ëÇϹǷÎ, ºÎµ¿ ¼Ò¼öÁ¡ ¿¬»ê°ú MMX ¿¬»êÀ» È¥ÇÕÇؼ »ç¿ëÇÒ °æ¿ì¿¡´Â ÁÖÀÇ°¡ ÇÊ¿äÇÏ´Ù.
MMX ¿¬»ê¿¡´Â, 4°¡ÁöÀÇ µ¥ÀÌÅÍÇüÀ» °è»êÇÒ ¶§¿¡ ÀÌ¿ëÇÑ´Ù. Packed Byte/Packed Word/Packed Double Word/Quad WordÀÌ´Ù. Packed Byte¶ó´Â °ÍÀº, 64 ºñÆ® ·¹Áö½ºÅ͸¦ 8ºñÆ®¾¿ 8°³ÀÇ ¿µ¿ªÀ¸·Î ³ª´« ÇüÅÂÀÇ µ¥ÀÌÅÍÇüÀÌ´Ù. ±×¸²À¸·Î ¼³¸íÇϸé, ¾Æ·¡ÀÇ ±×¸²°ú °°´Ù. »óÀÚ·Î µÑ·¯½Î¿© Àֱ⠶§¹®¿¡, ÆÑ(Packed)À̶ó°í ºÎ¸¥´Ù.
Chapter 8 - 2 ¡¡ MMX¸¦ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö üũ
MMX¸¦ »ç¿ëÇϱâ Àü¿¡ MMX ÀνºÆ®·°¼ÇÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ´ÂÁö üũ ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.
üũ·çƾ¿¡´Â CPUID ÀνºÆ®·°¼ÇÀ» »ç¿ëÇÑ´Ù. ±¸Ã¼ÀûÀÎ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°´Ù.(ÀζóÀξî¼À »ç¿ë)
/* CPUIDÀÇ Á¸Àç üũ */ BOOL IsCPUID() { DWORD dwPreEFlags, dwPostEFlags; _asm { /* EFlags ÀÇ °ªÈ¹µæ */ pushfd pop eax mov dwPreEFlags, eax /* CPUID ÀνºÆ®·°¼ÇÀÇ Á¸Àçüũ (ID Ç÷¡±× üũ) */ xor eax, 00200000h push eax popfd /* EFlags ÀÇ °ªÀÇ È¹µæ */ pushfd pop eax mov dwPostEFlags, eax } if(dwPreEFlags == dwPostEFlags) return FALSE; return TRUE; } /* MMX °¡´É¿©ºÎ üũ */ BOOL IsMMX() { DWORD dwRetEDX; /* CPUID ÀνºÆ®·°¼Ç üũ */ if(! IsCPUID()) return FALSE; /* MMX °¡´É¿©ºÎ üũ */ _asm { mov eax, 1 cpuid and edx, 00800000h mov dwRetEDX, edx } if(dwRetEDX) return TRUE; return FALSE; }
Chapter 8 - 3 ¡¡ Æ÷È ¿¬»ê¡¤ºñÆ÷È ¿¬»ê
MMX ¿¬»ê¿¡´Â Æ÷È ¿¬»ê°ú ºñÆ÷È ¿¬»êÀÌ ÀÖ´Ù. Æ÷È ¿¬»êÀº, ¿¬»êÀ¸·Î ¿À¹öÇ÷οì/¾ð´õ Ç÷οì(underflow)°¡ ¹ß»ýÇßÀ» °æ¿ì ±× ÃÖ´ë°ª/ÃÖ¼Ò°ªÀ» ÀÚµ¿À¸·Î ´ëÀÔÇØ ÁÖ´Â ¿¬»êÀÌ´Ù. ºñÆ÷ÈÀÇ °æ¿ì´Â ±×°ÍÀ» ¼öÇàÇÏÁö ¾Ê´Â´Ù.
±¸Ã¼ÀûÀÎ ¿¹¸¦ µé°Ú´Ù. Packed Byte¿¡¼ MMX ¹«ºÎÈ£ ¿¬»êÀ» »ý°¢ÇØ º¸ÀÚ. ÇÑ°³ÀÇ ¿ä¼Ò°¡ 240 + 23 = 263 À¸·Î, ¿À¹öÇ÷ο찡 ¹ß»ý ÇßÀ» °æ¿ì, ÀÚµ¿À¸·Î ÃÖ´ë°ªÀ» ´ëÀÔÇØ ÁØ´Ù. Áï ÀÌ °æ¿ì´Â, 255 °¡ ´ëÀԵȴÙ. ´ÙÀ½ÀÇ ±×¸²À» º¸¸é ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
µ¡ºÙÀ̸é PADDUSB ¶ó´Â °ÍÀº, ¹«ºÎÈ£ Æ÷È °¡»ê ¿¬»êÀ» ¼öÇàÇÏ´Â MMX ÀνºÆ®·°¼ÇÀÌ´Ù. (Packed Add Unsigned with Satuation Byte)
MMX ÀνºÆ®·°¼Ç¿¡´Â ´ÙÀ½°ú °°Àº °ÍÀÌ ÀÖ´Ù. °£´ÜÈ÷ ¼³¸íÇÑ´Ù.
µ¥ÀÌÅÍ Àü¼Û ÀνºÆ®·°¼Ç MOVD 32 ºñÆ® µ¥ÀÌÅÍ Àü¼Û ÀνºÆ®·°¼Ç MOVQ 64 ºñÆ® µ¥ÀÌÅÍ Àü¼Û ÀνºÆ®·°¼Ç »ê¼ú °¡°¨(»óÅÂ) ¿¬»ê ÀνºÆ®·°¼Ç PADDx / PSUBx ºñÆ÷È ¿¬»ê ÀνºÆ®·°¼Ç x = B(BYTE) / W(WORD) / D(DWORD) PADDSx / PSUBSx ºÎÈ£ ÷ºÎ Æ÷È ¿¬»ê ÀνºÆ®·°¼Ç x = B(BYTE) / W(WORD) PADDUSx / PSUBUSx ¹«ºÎÈ£ Æ÷È ¿¬»ê ÀνºÆ®·°¼Ç x = B(BYTE) / W(WORD) °ö¼À ÀνºÆ®·°¼Ç PMULHx / PMULLx °ö¼À ÀνºÆ®·°¼Ç x = W(WORD) / D(DWORD) ³í¸® ¿¬»ê ÀνºÆ®·°¼Ç PAND / PANDN / POR / PXOR ¡¡ ½¬ÇÁÆ® ¸í·É PSLLx / PSRLx ÁÂ/¿ì³í¸® ½¬ÇÁÆ® PSRAx ¿À¸¥ÂÊ »ê¼ú ½¬ÇÁÆ® º¯È¯ ÀνºÆ®·°¼Ç PACKSSxx ºÎÈ£È Æ÷È ÆÑÈ xx = WB / DW PACKUSxx ¹«ºÎÈ£ Æ÷È ÆÑÈ xx = WB PUNPCKHxx »óÀ§ unpackÈ xx = BW / WD / DQ PUNPCKLxx ÇÏÀ§ unpackÈ xx = BW / WD / DQ Á¦¾î EMMS MMX ÀÇ Á¾·á ¸¶Áö¸·ÀÇ EMMS ÀνºÆ®·°¼ÇÀº, MMXÀÇ »ç¿ëÀ» Á¾·áÇßÀ» ¶§¿¡ ¹Ýµå½Ã ¼öÇàÇØ¾ß ÇÑ´Ù. MMX´Â FPUÀÇ ·¹Áö½ºÅ͸¦ °øÀ¯Çؼ »ç¿ëÇϹǷÎ, ¸í½ÃÀûÀ¸·Î ·¹Áö½ºÅ͸¦ EMMS ÀνºÆ®·°¼ÇÀ¸·Î ÃʱâÈÇØ µÎÁö ¾ÊÀ¸¸é ¾È µÇ±â ¶§¹®ÀÌ´Ù.
Chapter 8 - 4 ¡¡ ½ÇÁ¦ ÇÁ·Î±×·¥¡¤¾ËÆÄºí·»µù
½ÇÁ¦·Î MMX¸¦ »ç¿ëÇؼ ¿¬»êÇØ º¸ÀÚ. À̹ø¿¡´Â 2°³ÀÇ µ¥ÀÌÅÍÀÇ µ¡¼ÀÀ» ½Ç½ÃÇÑ´Ù. ¸¸¾à È»óÀÚ·áÀÏ °æ¿ì¶ó¸é,¡¸¾ËÆÄºí·»µù(Add Alpha-Blending)¡¹À̶ó´Â ±â¼úÀÌ´Ù.(¹ÝÅõ¸í ó¸®)
/* Dest = Dest + Src ¸¦ ¼öÇàÇÑ´Ù * µ¥ÀÌÅÍÀÇ ±æÀÌ´Â 8ÀÇ ¹è¼ö¿©¾ß¸¸ ÇÑ´Ù */ void AddData(BYTE *lpDestBuf, BYTE *lpSrcBuf1, BYTE *lpSrcBuf2, DWORD nLength) { _asm { /* ÃʱâÈ */ mov ecx, nLength; shr ecx, 3 mov edi, lpDestBuf mov ebx, lpSrcBuf1 mov edx, lpSrcBuf2 /* ·çÇÁ ¿¬»ê */ ADD_LOOP: movq mm0, [ebx] movq mm1, [edx] /* µ¥ÀÌÅÍ °¡»ê */ paddusb mm0, mm1 /* °á°ú¸¦ ÀúÀå */ movq [edi], mm0 /* Áõ°¨(increment) */ add edi, 8 add ebx, 8 add edx, 8 dec ecx jnz ADD_LOOP /* MMX Á¾·á */ emms } }ÀÌ·± °£´ÜÇÑ ¿¹Á¦·Î, MMX¿¡ ´ëÇؼ ¾È´Ù´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. ÀÌ·± ºÎºÐÀ» ±âÃÊ·Î Çؼ ÀÀ¿ëÇØ ³ª°¡¸é, È»ó ó¸®¿Í °°Àº ºÎºÐ¿¡¼ 󸮴ɷÂÀ» Å©°Ô °³¼±ÇÒ ¼ö°¡ ÀÖ´Ù. ÀÚ ÀÌÁ¦ºÎÅÍ´Â ½º½º·Î ¿©·¯°¡Áö ÇÁ·Î±×·¥À» Â¥ º¸°í ½Ç°¨ÇØ º¸±â¹Ù¶õ´Ù.