質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

x86

x86はIntel 8086 CPU シリーズの命令セットアルキテクチャーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1365閲覧

Visual C/C++ インライン アセンブラーでmov命令で指定のアドレスに書き込みたいのですが、無効なオペランドになってしまいます。

askman

総合スコア26

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

x86

x86はIntel 8086 CPU シリーズの命令セットアルキテクチャーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/08 02:06

編集2020/09/08 02:21

前提・実現したいこと

Visual C/C++ インライン アセンブラーでmov命令を使用しメモリへ0xFFFFを書き込むことを実現したいです。

発生している問題・エラーメッセージ

mov [0x2010], al;の部分で「オペランドの型が無効です」とエラーが出てしまいます。

該当のソースコード

C++

1int main() 2{ 3 4 __asm { 5 mov al, 0xFF; 6 mov [0x2010], al; 7 } 8}

試したこと

C++

1int main() 2{ 3 4 __asm { 5 mov eax, 0xFFFFFFFF; 6 mov ebx, 0x20000000; 7 mov [ebx], eax; 8 nop; 9 } 10}

これをしたら場所 0x20000000 への書き込み中にアクセス違反が発生しましたと例外がスローされます。どこへ書き込みするのなら許されるのでしょうか?それとも根本的に自分でアドレスを指定して書き込むことはできないんでしょうか。。。

補足情報(FW/ツールのバージョンなど)

visual studio 2019
C++

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

それとも根本的に自分でアドレスを指定して書き込むことはできないんでしょうか。。。

はい、Windowsでは、アプリケーションが利用するメモリは実行ごとに変動しますので、「固定のメモリアドレスを読み書きする」ような用事は基本的に発生しません。

C言語側など、適当な方法でメモリを確保して、そこのアドレスを使うようにしてください。

投稿2020/09/08 02:34

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c

1#include <stdio.h> 2 3int a; 4 5int main(void) 6{ 7 __asm { 8 mov eax, 0xFFFFFFFF; 9 lea ebx, a 10 mov [ebx], eax; 11 nop; 12 } 13 printf("%p\n", &a); 14 printf("%x\n", a); 15}

32ビット版(x86) では、これで動きました。

実行結果

text

10026A2D0 2ffffffff

投稿2020/09/08 03:21

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そういう命令は存在しないってだけのはなしかと

投稿2020/09/08 02:19

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

askman

2020/09/08 02:22

命令は存在しないんですね。指定のアドレスへmov命令で書き込みするのはどうやって実現したらいいんでしょうか。。。
y_waiwai

2020/09/08 02:23

レジスタにアドレス入れればいいです
askman

2020/09/08 02:29

入れたらできました!ただ、指定したアドレスへ書き込もうとすると「場所 0x20000000 への書き込み中にアクセス違反が発生しました」とでてしまいます。。書き込むアドレスはどこらへんが適切なんでしょうか。
y_waiwai

2020/09/08 02:31

そりゃ書き込みが許可されてなければそうなります でたらめなアドレスで書き込もうとしてもダメです
askman

2020/09/08 02:35

メモリ確保するんですね!ありがとうございました!
y_waiwai

2020/09/08 02:37

簡単にするならC側で変数定義してそのアドレス持ってくればいいかと
guest

0

これをしたら場所 0x20000000 への書き込み中にアクセス違反が発生しましたと例外がスローされます。どこへ書き込みするのなら許されるのでしょうか?それとも根本的に自分でアドレスを指定して書き込むことはできないんでしょうか。。。

OSに保護されたメモリアドレスに書き込んだらアクセス違反になります。
自分で確保したメモリ領域のアドレスに書き込んでください。

投稿2020/09/08 02:31

編集2020/09/08 02:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

askman

2020/09/08 02:35

このインラインアセンブラでメモリ確保の方法(命令)はないでしょうか?何でも聞いてしまってすみません。。。
askman

2020/09/08 02:38

すみませんでした。命令は自分で調べます(ヒエッ)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問