- ベストアンサー
インラインアセンブラの関数について質問です
salsberryの回答
gcc/gasの流儀に従って書くならこうじゃないでしょうか。 void write_mem82(int addr, int data) { char data8 = (char)data; __asm__( "movb %1, (%0)\n\t" : : "r"(addr), "r"(data8) ); } 「GCC インラインアセンブラ」でググれば情報は見つかります。
関連するQ&A
- C/C++のインラインアセンブラに関する質問
使っているコンパイラはボーランドのフリーのC++のコンパイラなのですが インラインアセンブラのソースをコンパイルするとこんなエラーメッセージがでます( 警告 W8002 roger.cpp:8アセンブラを使う為コンパイラを再起動した(関数(main()) エラーE2133 ’tamsm32.exe'を実行できない とエラーメッセージが出ます 調べても解決方法がわからないのですが 解る方は教えてください ついでにコンパイルしようとしたソースは↓です #include<iostream.h> void main(){ int w=8; int w2=5; _asm{ mov eax,w mov edx,w2 }; cout<<w<<endl; };
- ベストアンサー
- C・C++・C#
- C++とインラインアセンブラでのポインタ値が違う
C言語で取得した配列変数の先頭ポインターとインラインアセンブラで取得したポインターが異なる現象が起きました。 2個のソースファイルを持つ下記プログラムで、pointer1とpointer2が異なる原因を教えてください。 ただし、提示のソースはあくまで、見本で実際には多くの変数やコードを記述しています。 開発環境はWin7(64bit)、VC++2010無償版です。 main.cpp #include <windows.h> int *disp; int *pointer1; int *pointer2; int data[8]; void disp_sub(); int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { _asm{ mov disp,offset disp_top call disp_sub jmp pgm_end disp_top: lea eax,data mov pointer1,eax } pointer2=&data[0]; if(pointer1 != pointer2)Beep(3000,1000); _asm ret pgm_end: return 0; } sub.cpp extern int *disp; void disp_sub() { _asm{ call disp } }
- 締切済み
- C・C++・C#
- x64移行でのインラインアセンブラ修正
Win32のプログラムをx64に移行する仕事を頼まれました。 プラットフォームをx64に移してビルドを行ったところ、 インラインアセンブラを使用していた以下のコードでエラーが発生しました。 ~前略~ __asm { mov eax, 0; /* EAXに0を入れる */ cpuid; /* CPUID実行 */ mov dword ptr [vender_sig + 0], ebx; /* 最初の4文字 */ mov dword ptr [vender_sig + 4], edx; /* 次の4文字 */ mov dword ptr [vender_sig + 8], ecx; /* 最後の4文字 */ mov byte ptr [vender_sig + 12], 0; /* ラストに \0 */ } ~中略~ __asm { mov eax, 1; /* EAXに1を入れる */ cpuid; /* CPUID実行 */ mov dword ptr [prosessor_sig], eax; /* プロセッサシグネチャ */ mov dword ptr [function_flag], ebx; /* ファンクションフラグ */ mov dword ptr [feature_flag2], ecx; /* Featureフラグ */ mov dword ptr [feature_flag1], edx; /* Featureフラグ */ } ~中略~ __asm { mov eax, 1; cpuid; /* CPUID実行 */ mov dword ptr [t], eax; /* top */ mov eax, 3; cpuid; /* CPUID実行 */ mov dword ptr [m], edx; /* middle */ mov dword ptr [b], ecx; /* bottom */ } ~後略~ x64ではインラインアセンブラが使用できないということはわかったのですが、 これをどう直していいかがわかりません。 アドバイスよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- アセンブリのプログラムです。
アセンブリのプログラムで質問があります。cのプログラムのオブジェクトファイルを生成して、objdumpというコマンドでアセンブリ言語を表示させてみたのですが、全然分からなくて、困っています 。どうか、アセンブリプログラムの、解説をよろしくお願いします。できれば、1文1文解説してもらえるとありがたいです。あと、スタックの動き、確保などの解説もあるとありがたいです。よろしくお願いします。 cのプログラム int fact(int p) { if(p<=1) return 1; else return fact(p-1); } アセンブリのプログラム push %ebp mov %esp,%ebp sub $0x8,%esp cmpl $0x1,0x8(%ebp) jg 15 <_fact+0x15> movl $0x1,-0x4(%ebp) jmp 24 <_fact+0x24> mov 0x8(%ebp),%eax dec %eax mov %eax,(%esp) call 0 <_fact> mov %eax,-0x4(%ebp) mov -0x4(%ebp),%eax leave ret nop nop nop
- ベストアンサー
- その他(プログラミング・開発)
- 機械語に直すことについて。
(機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret これのintと movとxor の機械語が分かりません。後、retの機械語が、farなのかnearなのかも分かりません。教えていただけないでしょうか?すみません。
- ベストアンサー
- その他([技術者向] コンピューター)
- システムコールについて。
アセンブリ言語で、int $0x80はシステムコールと言われていますが、Linuxを知らないとわかりません。システムコールはアプリとカーネルのインターフェースです。 x86 Linux 32bitのシステムコールの呼び出しは int 0x80です。 システムコールはEAXに格納されている数値でいろいろな処理ができます。 https://www.mztn.org/lxasm64/x86_x64_table.html を見ていただくとWRITEのsyscall#は4です。 mov $0x4,%eax でeaxに4を入れているので画面に出力したいのだとわかります。 WRITEの第2引数は画面に出力したい文字列が格納されているアドレスでECXに格納します。 mov %esp,%ecx とスタックポインターのアドレスをecxに入れています。 ESPは push eax でEAXに格納されている$0x616b6157(Waka)がスタックに退避しています。 WRITEの第3引数は文字数です。文字数はEDXに格納します。 mov $0x4,%edx と4が入っているので文字数は4です。 このプログラムを実行させると画面にWakaと表示して元の画面に戻ります。そのためのRETです。 C言語で書けばたった1行。 write(1,"Waka",4) これについて詳しく教えていただけないでしょうか?すみません。
- 締切済み
- その他([技術者向] コンピューター)
- NASMかNASKの文法の本
NASMかNASKのアセンブラを使っているのですが、MASMと構文が異なっている?せいか、エラーなりました。 MASMでは DW offset ADR_KOKO DW seg ADR_KOKO でOKだと思いますが、NASM/NASKではどうするのでしょうか? NASM,NASMの文法など詳しく載っている本などありますか?(洋書でも構いません。) DW 0 ; A---> オフセット DW 0 ; B---> セグメント ADR_KOKO: ;ここのオフセットとアドレス値をA,Bにセットしたい mov eax, 1 ... RET
- ベストアンサー
- その他(プログラミング・開発)
- 80486のキャッシュを無効にするとハングするのはなぜ?
アセンブラでこんな風にしているのですが、 なぜかハングアップします。 _DisableCache: mov eax, cr0 or eax, CR0_CACHE_FLAGS mov cr0, eax ret
- ベストアンサー
- その他(プログラミング・開発)
- アセンブラを実行したいのですが
パソコン初心者です。 Windows XPにアセンブラ「NASM」をダウンロードしました。 コマンドプロンプトで簡単なプログラムを実行しようと思います。 以下がプログラムです。 ; dispchar.asm mov ah,02 mov dl,31h int 21h mov ah,4ch mov al,0 int 21h コマンドプロンプトに「; dispchar.asm」と入力すると、内部コマンド、外部コマンドまたは操作可能なファイル、バッチファイルとして認識されていません」と出ます。 同様に、「mov ah,02」から入力しても同様のコメントが返ってきます。 プログラムを実行するにはどうすればよいでしょうか?
- ベストアンサー
- その他(ソフトウェア)
- アセンブリ言語について。
これが何をしているのか教えていただけないでしょうか?すみません。 これの事です。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret
- 締切済み
- その他([技術者向] コンピューター)
補足
回答くださりありがとうございます。結果から申しますと。無事動きました。!!エラーもありません。というか、私もこんなコードをかけるように勉強したいです。検索のキーワードをあげてくださっていますが、私が気付いていない可能性が高いので、お勧めのサイトがあれば、(書籍でもいいです。)紹介していただきたいのですが、お願いできますでしょうか。(大げさかもしれませんが、本心では弟子にしてほしいぐらいです。感動しました。でもさっぱり分かっていないように思います。)実際にコンパイルしたソースと実行結果のログを載せておきます。ありがとうございました。 bootpack.c -------------------------- static __inline__ void io_hlt2(void){ __asm __volatile ( "HLT\n\t" "RET" ); } void write_mem82(int addr, int data) { char data8 = (char)data; __asm__( "movb%1, (%0)\n\t" : : "r"(addr), "r"(data8) ); } void HariMain(void) { int i; for (i = 0xa0000; i <= 0xaffff; i++) { write_mem82(i, i & 0x0f); } for (;;) { io_hlt2(); } } 結果のログーーーーーーーーーーーーーーーーーーーーーーーー C:\TEST\test>make run C:\TEST\test>..\z_tools\make.exe run ../z_tools/make.exe -r img make.exe[1]: Entering directory `C:/TEST/test' ../z_tools/make.exe -r haribote.img make.exe[2]: Entering directory `C:/TEST/test' make.exe[2]: `haribote.img' is up to date. make.exe[2]: Leaving directory `C:/TEST/test' make.exe[1]: Leaving directory `C:/TEST/test' copy haribote.img ..\z_tools\qemu\fdimage0.bin 1 個のファイルをコピーしました。 ../z_tools/make.exe -r -C ../z_tools/qemu make.exe[1]: Entering directory `C:/TEST/z_tools/qemu' qemu.exe -L . -m 32 -localtime -std-vga -fda fdimage0.bin make.exe[1]: Leaving directory `C:/TEST/z_tools/qemu' C:\TEST\test> ここまでーーーーーーーーーーーーー 回答いただくまで作っていたプログラムがあるのですが、エラーが1つだけありHLTをスキップしてしまうものでした。ついでに載せておきます。 bootpack.c------------------------ここから asm("io_hlt2:"); asm(" haltl"); asm(" ret"); extern void io_hlt2(void); asm("write_mem82:"); asm(" movl %ecx, [%esp+4]"); asm(" movl %al, [%esp+8]"); asm(" movl [%ecx], %al"); asm(" ret"); extern void write_mem82(int addr, int data); void HariMain(void) { int i; for (i = 0xa0000; i <= 0xaffff; i++) { write_mem82(i, i & 0x0f); } for (;;) { io_hlt2(); } } ここまでーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー よろしくおねがいいたします。