<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++/C/MASM</title><link>http://blogs.wankuma.com/esten/category/2223.aspx</link><description>とりあえず基本、だって、好きなんだもん。</description><managingEditor>片桐　継（Tugu Katagiri）</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>汎用レジスタってやつがいる</title><link>http://blogs.wankuma.com/esten/archive/2010/08/04/191983.aspx</link><pubDate>Wed, 04 Aug 2010 12:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/04/191983.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/191983.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/04/191983.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/191983.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/191983.aspx</trackback:ping><description>&lt;P&gt;悩んだ悩んだ、出展探すのに。結局は、Microsoftさんのサイトでなく、Intelさんで見つけた。&lt;/P&gt;
&lt;P&gt;探し物は、「汎用レジスタ」について。&lt;/P&gt;
&lt;P&gt;ソース見て、書いて、いじれば自然と判ってきたけれど、やっぱり、「こうだよ」と背中をおしてほしいじゃない？出展はここで、こうだからこうなんだよ？としっかりと脳味噌に理解させたいしさ。&lt;/P&gt;
&lt;P&gt;というわけで、&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.intel.com/jp/download/index.htm"&gt;日本語技術資料のダウンロード&lt;BR&gt;http://www.intel.com/jp/download/index.htm&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;の中の「IA-32 インテルR アーキテクチャ　ソフトウェア・デベロッパーズ・マニュアル　上巻：基本アーキテクチャ」の６０ページ、3-4「基本プログラム実行レジスタ」の章がズバリそれ。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;･ EAX － オペランドと結果データ用のアキュムレータ。&lt;BR&gt;･ EBX － DSセグメント内のデータに対するポインタ。&lt;BR&gt;･ ECX －ストリング操作およびループ操作用のカウンタ。&lt;BR&gt;･ EDX －I/Oポインタ。&lt;BR&gt;･ ESI － DSレジスタがポイントするセグメント内のデータに対するポインタ；スト&lt;BR&gt;リング操作ではソースポインタ。&lt;BR&gt;･ EDI － ES レジスタがポイントするセグメント内のデータ（またはデスティネー&lt;BR&gt;ション）に対するポインタ；ストリング操作ではデスティネーション・ポインタ。&lt;BR&gt;･ ESP －（SSセグメント内の）スタックポインタ。&lt;BR&gt;･ EBP － （SSセグメント内の）スタック上のデータに対するポインタ。&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;ああ、すっきりした。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;MASMでプログラミングする時に、同じ機能を書いたとしても、汎用レジスタを目的にあわせて正しく使ってないと変な動きになったり、例外になったりしちゃう&lt;/STRONG&gt;&lt;FONT color=#000000&gt;って判った。&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;とりあえず、上中下。がっつり読んでみたなぁ。&lt;/P&gt;
&lt;P&gt;とその前に、発端となったプログラム（イミフ）のソース。&lt;/P&gt;
&lt;P&gt;呼び出し元はC。 
&lt;DIV style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:cd983023-d5d1-42b8-84a0-087c0857de52 class=wlWriterEditableSmartContent&gt;&lt;PRE class=c:nocontrols name="code"&gt;#include &lt;STDIO.H&gt;   
 
int MasmPlus(int);
int  wInt = 11;
  
int main(int argc, char* argv[])   
{   

   printf ("%d\n", wInt);   
   printf ("%d\n", MasmPlus (14)); 

   return 0;
}
&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;呼ばれMASM。やりたかった事は、渡された数字をwIntに足すだけの処理。&lt;/P&gt;
&lt;DIV style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ccc0bc02-6eb9-4196-9509-6eb87967841a class=wlWriterEditableSmartContent&gt;&lt;PRE class=c:nocontrols name="code"&gt;; Filename: MasmPlus.ASM   
.386   
.MODEL flat, C

EXTERN wInt:DWORD

.CODE   
  
MasmPlus PROC addInt:DWORD   
  
    mov esi, addInt 
    mov ebx, wInt   
    add esi, ebx     ;esiなので正しくない

  ret   
  
MasmPlus ENDP   

END  
&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;結果（11＋14なのにorz）&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://esten.cside.com/wankuma/img/0b265e7d9424_AA7A/image.png" width=121 height=95&gt; &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;で、これを下記のように修正して、 
&lt;DIV style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:cf0baa25-04a3-4fc7-893e-dfa7fe8be392 class=wlWriterEditableSmartContent&gt;&lt;PRE class=c:nocontrols name="code"&gt;; Filename: MasmPlus.ASM   
.386   
.MODEL flat, C

EXTERN wInt:DWORD

.CODE   
  
MasmPlus PROC addInt:DWORD   
  
    mov eax, addInt 
    mov ebx, wInt   
	add eax, ebx  ;eaxに変えてみる

  ret   
  
MasmPlus ENDP   

END  
&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;実行すると、&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://esten.cside.com/wankuma/img/0b265e7d9424_AA7A/image_3.png" width=102 height=83&gt; &lt;/P&gt;
&lt;P&gt;おお、動いた。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/191983.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>VisualStudio2010でMASM入りのプロジェクトを動かしてみる</title><link>http://blogs.wankuma.com/esten/archive/2010/08/02/191919.aspx</link><pubDate>Mon, 02 Aug 2010 23:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/02/191919.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/191919.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/02/191919.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/191919.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/191919.aspx</trackback:ping><description>&lt;p&gt;だいたいやり方はVisualStudio2008と一緒だったん。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;空プロジェクト作る&lt;/li&gt; &lt;li&gt;mainとなるCのソースコード書く&lt;/li&gt; &lt;li&gt;組み込みたいMASMファイルを「テキストファイル」で新規作成する&lt;/li&gt; &lt;li&gt;ファイルの名前をasm拡張子のファイルに変えて保存する&lt;/li&gt; &lt;li&gt;MASMソースを書く&lt;/li&gt; &lt;li&gt;プロジェクトの「ビルドのカスタマイズ」で「MASM」を有効にする&lt;/li&gt; &lt;li&gt;MASMファイルのプロパティが「ビルド対象」の「Microsoft Macro Assembler」であることを確認する&lt;/li&gt; &lt;li&gt;ビルドして実行&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;って、&lt;font color="#ff0000"&gt;2008とちょっと違って、「７」の作業が必要だった。&lt;/font&gt;これをやらないと、「ビルド対象外」にされちゃって、実行時にリンカが失敗してしまうのよね。&lt;font color="#0000ff"&gt;VisualStudio2010だと賢くなっちゃってるから、テキストファイルで追加した影響で、「こいつ、何もしなくていいよね」と判断された？とか思っちゃった。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://esten.cside.com/wankuma/img/VisualStudio2010MASM_1498F/image.png" width="578" height="337"&gt; &lt;/p&gt; &lt;p&gt;というわけで、この赤枠の所が画面の通りじゃないと、ビルドもリンクもしてくれない。&lt;/p&gt; &lt;p&gt;動かして、MASMで書いた関数がリンカエラーの場合、ここを疑ってみるのも一手ってことで。&lt;/p&gt; &lt;p&gt;ひとつ賢くなった。&lt;/p&gt; &lt;p&gt;これもConnectで追記しとくかな。以前あげたエントリに派生してる気がするし。&lt;/p&gt; &lt;p&gt;&lt;a href="https://connect.microsoft.com/VisualStudioJapan/feedback/details/581367/masm-asm#"&gt;MASMファイル(*.asm)の新規ファイル作成テンプレートを追加してほしい | Microsoft Connect&lt;br&gt;https://connect.microsoft.com/VisualStudioJapan/feedback/details/581367/masm-asm#&lt;/a&gt;&lt;/p&gt; &lt;p&gt;大変そうだなぁ、って感じてもらえたら、Voteください（笑）＜おい&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/191919.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>MASMを動かしてみた～VisualStudio2008でのビルド規則追加変更方法</title><link>http://blogs.wankuma.com/esten/archive/2010/07/28/191733.aspx</link><pubDate>Wed, 28 Jul 2010 18:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/07/28/191733.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/191733.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/07/28/191733.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/191733.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/191733.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/tocchann/archive/2010/07/28/191731.aspx"&gt;Native ニーモニックなプロジェクトは&amp;#8230;&lt;BR&gt;http://blogs.wankuma.com/tocchann/archive/2010/07/28/191731.aspx&lt;/A&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.wankuma.com/esten/archive/2010/07/28/191730.aspx"&gt;MASMを動かしてみた～VisualStudioで&lt;BR&gt;http://blogs.wankuma.com/esten/archive/2010/07/28/191730.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;のエントリの補足～&lt;/P&gt;
&lt;P&gt;VisualStudio2008（Professional以上　もしくはExpressでSP1導入済み）の場合、&lt;/P&gt;
&lt;P&gt;作成したC++（C）のプロジェクトのところで右クリックすると、メニューが出てくるの。&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://esten.cside.com/wankuma/img/MASMVisualStudio2008_FEEF/image.png" width=174 height=365&gt; &lt;/P&gt;
&lt;P&gt;ここの「カスタム ビルド規則」ってのを選択すると、&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://esten.cside.com/wankuma/img/MASMVisualStudio2008_FEEF/image_3.png" width=585 height=360&gt; &lt;/P&gt;
&lt;P&gt;がでてくるから、これの*.asmを選択すればOK。&lt;/P&gt;
&lt;P&gt;まっさらのプロジェクトにasmファイルを新規追加した時にも「カスタムビルド規則の変更」確認ダイアログがでるので素直に「OK」すれば大丈夫みたい。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/191733.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>MASMを動かしてみた～VisualStudioで</title><link>http://blogs.wankuma.com/esten/archive/2010/07/28/191730.aspx</link><pubDate>Wed, 28 Jul 2010 17:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/07/28/191730.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/191730.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/07/28/191730.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/191730.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/191730.aspx</trackback:ping><description>&lt;p&gt;いろいろと試行錯誤orz　くるしんだよ、べいべぇ。&lt;/p&gt; &lt;p&gt;なにしろ、&lt;font color="#ff0000"&gt;&lt;strong&gt;VisualStudioのファイルテンプレにASMがいない&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;ので、作っちゃいけないのかなーと頭を抱えてたんだよねぇ。&lt;/p&gt; &lt;p&gt;でも&lt;font color="#008000"&gt;&lt;strong&gt;、「拡張子asmでファイルをプロジェクトにいれて作って良い」ということに気付いた&lt;/strong&gt;&lt;/font&gt;ら、後は何とかなったｗ&lt;/p&gt; &lt;p&gt;というわけで、新規コンソールアプリ作って、ソースファイルフォルダに、hoge.asmを作成。&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;作ると「構成追加変更するよ」みたいなダイアログが出るので、そのままOKして適用してしまう。&lt;/font&gt;&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ec866cd8-cb29-4094-b228-5483d7f7e025" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;; Filename: MasmHoge.ASM
.386
.MODEL flat, C
.CODE

MasmHoge PROC uses esi, arraychar:PTR

   mov esi, arraychar ; Load ESI with the address of the char array.

   mov BYTE PTR [esi], "H"      ; Since a char is 1 byte long, each
   mov BYTE PTR [esi+1], "e"    ; successive element can be accessed
   mov BYTE PTR [esi+2], "l"    ; by adding 1 more to esi.
   mov BYTE PTR [esi+3], "l"    ; by adding 1 more to esi.
   mov BYTE PTR [esi+4], "o"    ; by adding 1 more to esi.
   mov BYTE PTR [esi+5], " "    ; by adding 1 more to esi.
   mov BYTE PTR [esi+6], "W"    ; by adding 1 more to esi.
   mov BYTE PTR [esi+7], "o"    ; by adding 1 more to esi.
   mov BYTE PTR [esi+8], "r"    ; by adding 1 more to esi.
   mov BYTE PTR [esi+9], "d"    ; by adding 1 more to esi.
   mov BYTE PTR [esi+10], "!"    ; by adding 1 more to esi.

   ret

MasmHoge ENDP
END
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これは、MasmHoge(char *)でそのアドレスに「Hello Word!」（Worldじゃない）を描く単純な処理ｗ&lt;/p&gt;
&lt;p&gt;でもって、呼び出し側&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:aad4aa3b-85c0-4b9e-9a78-2162befbb0da" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;#include "stdafx.h"
/* Filename: CMAIN.C */ 

#include &amp;lt;stdio.h&amp;gt;

#ifdef __cplusplus
extern "C" {
#endif

void MasmHoge (char *);

#ifdef __cplusplus
}
#endif

char chararray[11] = "abc";

int _tmain(int argc, _TCHAR* argv[])
{
   printf ("%s\n", chararray);
   MasmHoge (chararray);
   printf ("%s\n", chararray);
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;変数配列chararrayが、「abc」から「Hello Word!」になれば成功&lt;/p&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://esten.cside.com/wankuma/img/MASMVisualStudio_FA86/image.png" width="206" height="109"&gt; &lt;/p&gt;
&lt;p&gt;できたー♪&lt;/p&gt;
&lt;p&gt;&lt;font color="#808080"&gt;ひどりん、コメント＆ヒントさんきうです。&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/191730.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>MASMを動かしてみた</title><link>http://blogs.wankuma.com/esten/archive/2010/07/28/191722.aspx</link><pubDate>Wed, 28 Jul 2010 14:47:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/07/28/191722.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/191722.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/07/28/191722.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/191722.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/191722.aspx</trackback:ping><description>&lt;p&gt;まだ文字列操作の勉強はこれから。まずは四則計算ってことで足し算をしてみた。&lt;/p&gt; &lt;p&gt;環境はお気楽に、VisualStudio2008 を使ってみることにする。&lt;/p&gt; &lt;p&gt;VisualStudio2008で、C++の新規プロジェクトを作成して、新規ソースを追加&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:aae6a888-eba6-4653-a604-bfb7cf9859f2" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;#include "stdafx.h"
#include &amp;lt;iostream&amp;gt;

int _tmain(int argc, _TCHAR* argv[])
{
	
	int dwValue;
	dwValue = 5;

	__asm
   {
      mov eax, dwValue
      add eax, 100
      mov dwValue, eax
   }

	// 結果出力
	std::cout &amp;lt;&amp;lt; dwValue;

	// DOSプロンプトが消えないように入力待ちにする
	std::cin &amp;gt;&amp;gt;  dwValue;
	return 0;
}

&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;__asm{}の中がMASMのコード。&lt;/p&gt;
&lt;p&gt;単純に、dwValueさんに100を足してるだけだから、5+100 で105が出てくるはず。&lt;/p&gt;
&lt;p&gt;でもって、実行結果　↓&lt;/p&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://esten.cside.com/wankuma/img/MASM_CFE0/image.png" width="561" height="139"&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;さてと、足がかり確認。&lt;/p&gt;
&lt;p&gt;色々と勉強開始しよう、胡桃の脳なりにorz&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/191722.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>