Win32 MASM ÇÁ·Î±×·¡¹Ö ¼Ò°³(Visual C++ÀÌ¿ë)

Written by ±ÇÇÊÁø. 06'08 - aka Xeno

 


Chapter 1 ¡¡ Áغñ»çÇ×

°³¿ä : Win32 ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇϱâ Àü¿¡

Chapter 1 - 1 ¡¡ ÁÖÀÇ »çÇ×

MASM ÇÁ·Î±×·¡¹ÖÀ» Çϱâ Àü¿¡, ¸ðµç Ã¥ÀÓÀº ÀÚ½ÅÀÌ Áø´Ù´Â °ÍÀ» ¸í½ÉÇϱ⠹ٶõ´Ù. MASMÀº ·Î¿ì·¹º§ÀÇ ¸í·É¾î¸¦ ½ÇÇàÇÒ ¼ö Àֱ⠶§¹®¿¡, ¹ö±×°¡ ¹ß»ýÇßÀ» °æ¿ì ÄÄÇ»ÅÍ¿¡ Ä¡¸íÀûÀÎ ¿¡·¯ ȤÀº PCÀÚü°¡ ÀÛµ¿ÇÏÁö ¾Ê´ÂÀϵµ ÀÖÀ» ¼öµµ ÀÖ´Ù. ±×·¯¹Ç·Î,

ÀÌ ¹®¼­·Î ÀÎÇÏ¿© ¹ß»ýÇÑ ¼ÕÇØ ¹× ¹®Á¦´Â ÇÊÀÚ°¡ ¾î¶°ÇÑ Ã¥ÀÓ°ú º¸»óµµ ÁöÁö ¾ÊÀ½À» ¼÷ÁöÇÏ°í Àо°¡±â ¹Ù¶õ´Ù.

(³Ê¹« °Ì¸ÔÀ»ÇÊ¿ä´Â ¾ø´Ù)

ÁÖÀÇ£ºÀÌ ¹®¼­´Â 2006³â°æ¿¡ ÀÛ¼º Çß´Ù. Å×½ºÆ® ȯ°æÀ¸·Î¼­´Â WindowsXP-SP2ȯ°æÀ¸·Î Å×½ºÆ®Çß´Ù. º» ¹®¼­´Â ¼ö½Ã·Î º¯°æ µÉ ¼öµµ ÀÖ´Ù.

Chapter 1 - 2 ¡¡ MASM ÀÔ¼ö

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 ¡¡ Çϵå¿þ¾îÀÇ ±¸Á¶

°³¿ä : ÄÄÇ»ÅÍ¿¡ ´ëÇؼ­

Chapter 2 - 1 ¡¡ Çϵå¿þ¾î

À̹ø¿¡´Â, °£´ÜÇÏ°Ô Çϵå¿þ¾îÀÇ ±¸Á¶¿¡ ´ëÇØ ¼³¸íÇÑ´Ù. Çϵå¿þ¾îÀÇ ±¸Á¶¶ó ÇÏ´õ¶óµµ, USBÀÇ ±Ô°ÝÀ̳ª, ¸ÞÀκ¸µå´Â ¾î¶»°Ô ±¸¼ºµÇ¾î Àִ°¡, ±×·± °ÍÀ» ´Ù·ç´Â °ÍÀÌ ¾Æ´Ï´Ù. ´ëºÎºÐÀ» CPU ÀÇ ±¸Á¶¿¡ ´ëÇØ ¼³¸íÀ» ÇÒ °ÍÀÌ´Ù. ¡¸ÃÖ¼ÒÇÑ, À̰͸¸Àº ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÑ´Ù¡¹¶ó´Â ºÎºÐÀ» À§ÁÖ·Î Çؼ­ ¼³¸íÇØ ³ª°¥°ÍÀÌ´Ù.

´ÙÀ½ÀÇ ¼ø¼­·Î ¼³¸í ÇÒ °ÍÀÌ´Ù.

  1. ¾î¼Àºí·¯¿¡¼­ °¡´ÉÇÑ °Í
  2. ÀúÀåÀåÄ¡(·¹Áö½ºÅÍ/¸Þ¸ð¸®/½ºÅÃ)
  3. ¿ÜºÎ ÀԷ°ú ¿ÜºÎ Ãâ·Â(I/O)¡¤ÀÎÅÍ·´Æ®
  4. 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 ±îÁöÀÇ ¿µ¿ªÀÌ Á¸ÀçÇÑ´Ù. ¹°·Ð, ½ÇÁ¦ ¸Þ¸ð¸®´Â ÀÌ·¸°Ô »ç¿ëµÇÁö´Â ¾Ê´Â´Ù. ´ÜÁö ¿¹¸¦ µç °ÍÀÌ´Ù.

 

Chapter 2 - 5 ¡¡ ¸Þ¸ð¸®

±â¾ïÀåÄ¡ÀÌ´Ù.¡¸¸Þ¸ð¸®¡¹¿¡ °ªÀ» ´ëÀÔÇÒ ¼öµµ ÀÖ´Ù. ¿ì¼±, ÇÁ·Î±×·¥À» º¸ÀÚ.

;*****************************************************************
;  ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥
;*****************************************************************

.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¸¦ ÇÒ¶§ ±¦È÷ Çò°¥·È´Ù. ¿ÀÈ÷·Á.......

Chapter 2 - 6 ¡¡ ½ºÅÃ

½ºÅÃÀº, ÈÄÀÔ¼±Ãâ (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 ¶óÀ̺귯¸®¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

Chapter 3 - 4 ¡¡ ·ÎÄà º¯¼ö

´ÙÀ½¿¡´Â, ·ÎÄà º¯¼ö¿¡ ´ëÇؼ­ ¾Ë¾Æº¸ÀÚ.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ¾î¼Àºí·¯ À©µµ¿ì ÇÁ·Î±×·¡¹Ö
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

.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"¶ó´Â °á°ú°¡ ³ª¿À°Ô µÈ´Ù.

Chapter 3 - 5 ¡¡ À©µµ¿ì »ý¼º

ÀÌÁ¦ºÎÅÍ´Â, ½ÇÁ¦·Î À©µµ¿ì¸¦ »ý¼ºÇØ º»´Ù. ÇÁ·Î±×·¥ÀÇ ³»¿ëÀÌ Á» ±æÁö¸¸ õõÈ÷ »ìÆ캸ÀÚ.

;******************************************************************************
; ¾î¼Àºí·¯ À©µµ¿ì ÇÁ·Î±×·¡¹Ö 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°³ÀÇ ÆÄÀÏÀ» ±â¾ïÇØ µÎ¸é Æí¸®ÇÏ´Ù.

  1. windows.inc À©µµ¿ì°ü·ÃÁ¤¼ö°¡ Á¤ÀǵǾî ÀÖ´Â ÀÎŬ·çµå ÆÄÀÏ
  2. kernel32.inc Ä¿³ÎÇÔ¼ö(ÄÚ¾î ÇÔ¼ö)°¡ Á¤ÀǵǾî ÀÖ´Â ÆÄÀÏ
  3. user32.inc À¯ÀúÇÔ¼ö(À¯Àú ÀÎÅÍÆäÀ̽º ÇÔ¼ö)°¡ Á¤ÀǵǾî ÀÖ´Â ÆÄÀÏ
  4. 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¸¦ »ç¿ëÇÔÀ¸·Î½á , ½ÇÇà½ÃÀÇ ½ºÅú¯¼öÀÇ ÁÖ¼Ò¸¦ ¾òÀ» ¼ö°¡ ÀÖ´Ù.

Chapter 5 - 4 ¡¡ NULL¿Í'\0'

ÇÑ°¡Áö ÁÖÀÇÇÒ °ÍÀÌ, NULL = 0 ȤÀº, '\0' = 0 ¾Æ´Ï´Ù. È®½ÇÈ÷, Çì´õÆÄÀÏÀ» º¸¸é, NULL = 0 À¸·Î Á¤ÀǵǾî ÀÖ´Ù. ±×·¯³ª ±×°ÍÀº ÆíÀÇ»ó Á¤ÀǵȰÍÀ̹ǷÎ, ÀǹÌÀûÀ¸·Î´Â ´Ù¸£´Ù. Ȥ½Ã ´Ù¸¥ °³¹ßȯ°æ¿¡´Â NULL = -1 ¶ó°í Á¤ÀǵǾî ÀÖÀ»Áöµµ ¸ð¸¥´Ù.

Æ÷ÀÎÅͳª ÇÚµéµîÀÌ Á¤ÇØÁöÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â, ¹Ýµå½Ã NULL À» »ç¿ëÇϵµ·Ï ÇÑ´Ù. Windows ·ÎºÎÅÍ ±¸ÇØÁö´Â ¸ðµç ÇÚµéÀº, ½ÇÁ¦·Î (void *) ÇüÅÂÀ̹ǷΠNULLÀ» »ç¿ëÇÏ´Â ÀÌÀ¯¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¶Ç´Ù½Ã , C ¾ð¾î À̾߱â·Î µÇ¾úÁö¸¸, '\0'´Â ¹®ÀÚ¿­ÀÇ ³¡À» ³ªÅ¸³»´Â ±âÈ£»ó¼öÀ̹ǷÎ, ¹®ÀÚ¿­ ¿Ü¿¡¼­ »ç¿ëÇؼ­´Â ¾ÈµÈ´Ù. NULLµµ °°ÀÌ ¸Æ¶ôÀ¸·Î Á¤ÇØÁø ¿ëµµ ÀÌ¿Ü¿¡´Â »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù.

 

Chapter 5 - 5 ¡¡ ExitProcess

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¿¡ ´ëÇؼ­ ¾È´Ù´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. ÀÌ·± ºÎºÐÀ» ±âÃÊ·Î Çؼ­ ÀÀ¿ëÇØ ³ª°¡¸é, È­»ó ó¸®¿Í °°Àº ºÎºÐ¿¡¼­ 󸮴ɷÂÀ» Å©°Ô °³¼±ÇÒ ¼ö°¡ ÀÖ´Ù. ÀÚ ÀÌÁ¦ºÎÅÍ´Â ½º½º·Î ¿©·¯°¡Áö ÇÁ·Î±×·¥À» Â¥ º¸°í ½Ç°¨ÇØ º¸±â¹Ù¶õ´Ù.