【無料配信♪】Renta !全タテコミ作品第1話

SHの、
MOV.L @(H'104:8,PC),R6
の意味がソフトウェアマニュアルをみてもよくわかりません。

ソフトウェアマニュアルをみると、PCに0x104を加えた値をR6にムーブ
すると読めるのですが、PC(0x000017DC)に対してR6は0xFFFFE6B0に
なります。

0x000017DC+0x104のメモリをみましたが、0xFFFFE6B0は見当たりません。

どなたかアドバイスお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

SHはあんまり得意じゃないのですが、



SH2のソフトウエアマニュアルを見てみました。

計算方法としては、
現PC&0xfffffffc)+4 + 0x104 を指す中身をR6にムーブ 
になり
実際には、
(0x17DC & 0xfffffffc)+4+(0x104) = 0x17E0+0x104 = 18E4

*(0x18E4)が 0xffffe6b0
になっているんじゃないでしょうか?

一応シミュレータで確認済みです。
#さらにSH3,4の場合はキャッシュがあるのですぐに反映されないよう
#です。

以下蛇足:
アセンブラおよびDisassemblerの仕様により、ディスプレースメントが
スケーリングされている場合、されていない場合があります。
本来8bit長なわけで、最大0xff ですので超えています。
4倍がすでにされているので、そのまま加算します。
R社純正以外にもサードパーティ製のアセンブラの場合には考慮が必要な
場合があります。

riscプロセッサなので、命令長が固定のため、イミディエイト命令が
2byte長 4byte長は命令内にかけないので、
ROM上にデータを置いて、PC相対番地でレジスタに読み込む
ようになっているようです。
    • good
    • 0
この回答へのお礼

もう一度メモリの内容をよくみてみます。
回答ありがとうございました。

お礼日時:2008/07/30 14:16

自分はSHシリーズを使った事は無いが、アセンブラは齧った事があるのでちょっとだけ突っ込みを。



以下のマニュアルにざっと目を通してみた。

 http://documentation.renesas.com/jpn/products/mp …

MOV.L @(disp:8,PC),Rnの命令の動作を見ると、質問者殿の説明と微妙に異なり

 (disp×4+PC)→Rn

と書かれている。
自分はSHのアセンブラを知らないので、ディスプレースメント(H'104)の意味に今一確信が持てないんだが、もしも想像通り16進でのイミディエイト値であるなら

 ( 0x104 × 4 + PC ) → R6

となるべきだと思うのだが、どうだろう。

#マニュアルは良く読もうね
    • good
    • 0
この回答へのお礼

はい。よく読みます。
回答ありがとうございます。

お礼日時:2008/07/30 14:17

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【H8マイコン】HEWで埋め込みアセンブラ

タイトル通りHEWでCソースに一部アセンブラを使いたいのですが、Webにサンプルとなる物がほとんどなく、マニュアルを読んで試してみたところやはり上手くいきません。用途はLCDを使う時の短い遅延です。__asm {}で囲うだけではだめで、#pragma asmを入れてみてもだめでした。陥りやすい盲点だけでも結構ですのでよろしくお願いします。

Aベストアンサー

ルネサステクノロジのサイトから、コンパイラパッケージのドキュメントを見ると、Cソースにアセンブラコードを記述する拡張機能を利用する場合、これらが有効となる条件が各拡張機能毎に異なる仕様になっていることが記載されているのが読み取れます。

1) __asmが利用できる条件は
「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.1 #pragma 拡張子、キーワード」→「(3)その他の拡張機能」→「アセンブラ埋め込み機能」→「__asm」→「備考」に記載されているとおり、H8SX及びH8SのCPUを指定した場合

2) #pragma asm,#pragma endasmが利用できる条件は
「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.1 #pragma 拡張子、キーワード」→「(3)その他の拡張機能」→「アセンブラ埋め込み機能」→「#pragma asm」→「備考」に記載されているとおり、code=asmcodeオプションを指定した場合

3) #pragma inline_asmが利用できる条件は
「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.1 #pragma 拡張子、キーワード」→「(2)関数に関する拡張機能」→「アセンブラ記述関数のインライン展開」→「#pragma inline_asm」→「備考」に記載されているとおり、code=asmcodeオプションを指定した場合

それぞれの詳細はマニュアルの項目を参照してください。

なお、Cソース上でNOP命令を埋め込むだけなら、「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.3 組み込み関数」→「NOP命令」の項目に記載されているように、ヘッダ<machine.h>をincludeして、nop()関数を利用することで、すっきり簡単に実現できることが読み取れます。

参考URL:http://documentation.renesas.com/jpn/products/tool/rjj10b0166_h8s.pdf

ルネサステクノロジのサイトから、コンパイラパッケージのドキュメントを見ると、Cソースにアセンブラコードを記述する拡張機能を利用する場合、これらが有効となる条件が各拡張機能毎に異なる仕様になっていることが記載されているのが読み取れます。

1) __asmが利用できる条件は
「10.C/C++言語仕様」→「10.2 拡張機能」→「10.2.1 #pragma 拡張子、キーワード」→「(3)その他の拡張機能」→「アセンブラ埋め込み機能」→「__asm」→「備考」に記載されているとおり、H8SX及びH8SのCPUを指定した場合

2) #prag...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qteratrermを使ったデータの送信について

teratermで
16進数で下記の5バイトを送信したいのですが、どうすればいいでしょうか。

\x85\x02\x00\x01\x86

VTウィンドウにキーボードで直接打ち込むと、一文字ごとに送信されているようで、うまく行きませんでした。

Aベストアンサー

送信したい文字列を書いたファイルを作成してください。

teratrerm メニューの「ファイル(F)」-「ファイル送信(S)」を選び、作成したファイルを選択してください。
このとき作成したファイルの内容がバイナリーの場合送信ファイル選択画面のオプションで「バイナリー(B)」にチェック入れてください。

>16進数で下記の5バイトを送信したいのですが、どうすればいいでしょうか。
たぶんバイナリーだとおもいますのでファイルはバイナリーエディターで作成してください。

注)これは日本語化したteratermでの説明です

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QExcelでビット演算子?

Excelでビット演算子の
左シフト演算をさせることは
でるでしょうか?
0xff<<8 の演算をさせたいのですが
何か関数はあるでしょうか?

Aベストアンサー

エクセルにシフト演算子は無いような気がしますが,nビットシフトさせたいのであれば,2のn乗を掛けたら良いと思います。

例:A1セルを8ビット左シフトしたい場合
=A1*2^8

例:A1セルを8ビット右シフトしたい場合
=int(A1/2^8)

QCPUの処理量を減らすコーディング(組み込み)

処理が重くてプログラムが回らないので、どうにかして実行量を下げ
ようとしています。
CPUはSH2(80MHz)、内蔵メモリ(ROM、RAM)と、
外付けのフラッシュROM、RAMがあります。
OSはuItron仕様のRTOSで、プログラムはC(一部アセンブラ)
で記述しています。
作成開始前の想定では、昔、68000の12MHzで動かしていた
ソフトにシリアル通信が少し増えた程度なので、CPUの能力不足で
困るなどとは想像してなかったのですが、CPUは高速化したものの
外付けメモリの速度が足りないので外部のバスアクセスは実質10M
Hz程度しか出ないということが後で分かりました。
内蔵メモリだけで動かせば外部使用時の数倍のパフォーマンスが出る
のですが、容量が少なくてソフト全体の20%ほどしか使えません。
I2Cバス(400kbps)と子局機器とのシリアル通信(115
kbps)がメインなので、これらの割り込み処理だけでも内蔵メモ
リで駆動できないかと模索中です。
他には、関数の引数(スタック待避・復帰の処理量)を減らすなどを
試していますが、これといった効果が出ていません。
ソースは10万行くらいあり、コーディング流儀の微細な変更でも、
”積もれば山”の可能性があります。
何かいい案があったら教えてください。

処理が重くてプログラムが回らないので、どうにかして実行量を下げ
ようとしています。
CPUはSH2(80MHz)、内蔵メモリ(ROM、RAM)と、
外付けのフラッシュROM、RAMがあります。
OSはuItron仕様のRTOSで、プログラムはC(一部アセンブラ)
で記述しています。
作成開始前の想定では、昔、68000の12MHzで動かしていた
ソフトにシリアル通信が少し増えた程度なので、CPUの能力不足で
困るなどとは想像してなかったのですが、CPUは高速化したものの
外付け...続きを読む

Aベストアンサー

私も今月から SH7085 + NORTi を使い始めました.
昔8ビットマイコンを自作したことはありますが,本格的な組込みの仕事は初めてです.

新しい A/D,D/A 変換基板用に別の人が作りかけていたソフトと,
その元になったソフト (別の基板用に基板メーカが作成したもの) を渡されて,
「まずハードウェアの評価をしないといけないので,とりあえず至急これを動かしてくれ」
と言われ,ようやく先日完成しました.

その過程で,あまり効率の良くないコードがたくさん目に付いたので,
製品版のソフトを開発する際には大幅に書き直してやろうと考えています.
以下,改良できそうな点のリストです.組込の専門家には常識と思いますが,
(自分用の備忘録を兼ねて) 一応ご参考まで.
(上記のソフトも組込みの専門家が書いたはずなんですが….
 組込みは初めてなので,どの程度効くかはわかりませんし,
 間違っているところもあるかもしれません.)

(1) 割込みハンドラに余計な仕事をさせている.
  複数のアナログ入力を A/D 変換したデータを多重化し,SSU で受信している (約1ms周期).
  その受信割り込みハンドラで,データのチェックとフォーマット変換を行って受信バッファに
  書き込んでいた.1ms の割込みハンドラにそんなことまでさせるなよ!
  受信データをそのままバッファに書き込んで,あとはデータ収集タスクにやらせりゃええやん!

(2) I/O レジスタを操作するのにビットフィールドを使い,
  複数のビットをセット (または複数のビットをリセット) している.例えば,

    #define SCI0 ((volatile t_SCI*)0xFFFFC000)

    // 受信エラーリセット
    SCI0.SCSSR.BIT.ORER = 0; // Overrun Error
    SCI0.SCSSR.BIT.FER = 0; // Framing Error
    SCI0.SCSSR.BIT.PER = 0; // Parity Error

   これでは SCSSR が6回もアクセスされてしまう (read/write 各3回).
   I/O レジスタのため volatile が付いており,最適化はされない.
   これを次のようにすれば2回のアクセスですむ (read/write 各1回).

    SCI0.SCSSR.BYTE &= ~(SCSSR_ORER | SCSSR_FER | SCSSR_PER);

(3) 排他制御
  ・排他制御の粒度が粗すぎる.受信割込みハンドラが書き込んだバッファの内容をを別の
   場所にコピーする間ずっと,バッファ全体を排他制御をしている.これではオーバーラン
   エラーが多発するはず.リングバッファであれば,書き込みポインタが読み出しポインタ
   を追い越さないようにするだけでいいはず (iTRON でどうやればいいのかまだわからないが).
   いやそれ以前に,コピーすること自体を見直した方がよい.

  ・排他制御すべきコード範囲が非常に短く,すぐ終わる処理ならば,セマフォなどを使わず
   一時的に割込み禁止にするだけの方が効率いいはず (マルチプロセッサではないので).
   例えば送受信などにリングバッファを使用している部分があるが,リングバッファの排他
   制御期間は非常に短くてすむので,これをセマフォではなく割込み禁止で行う.

(4) SH7085 (または SH-2) 固有の問題
  ・データキャッシュがない
   SH7085 には命令キャッシュはあるようだが,データキャッシュはないそうなので,
   (特に外部) メモリアクセスの回数を極力減らすことが必要.逆に参照の局所性は問題に
   ならず,ランダムアクセスを多用してもペナルティは発生しない (はず).したがって
   メモリアクセス順序がランダムになっても (特に外部) メモリアクセス回数を減らす
   方法があれば,そうする方がよい.(キャッシュがある場合とは逆)

  ・除算命令がない
   SH-2 には除算命令がない (1ステップ除算命令というのはあるが,これは商の1ビット
   だけを計算するものであり,商のビット数分繰り返す必要があるらしい) ので,
   特に高速化が必要な部分 (短周期割込み用ハンドラなど) ではできるだけ除算を避ける.
   ちなみに上記の 1ms 受信割り込みハンドラでは除算を (複数回) 使用していた.(-_-#)

  ・乗算命令の問題
   SH-2 の乗算命令は2ステート (32bit 乗算の場合) または4ステート (64bit の場合)
   で実行されるが,その間パイプラインがストールするうえメモリアクセス競合も発生する
   そうなので,使わなくてすむなら使わない方がよさそう.

  ・シフト命令
   ・SH-2 にはバレルシフタがない.→ 右辺が定数でないシフト演算子はなるべく避ける.
   ・SH-2 のシフト命令は,シフト数が 1/2/8/16 のものだけ.
    ただし算術シフト命令は1ビット用だけ.
    →・シフト演算子の右辺がなるべく 1/2/8/16 になるようにする.
      (ビットフィールドの配置を工夫するなど.)
     ・符号付整数のシフトはなるべく避ける.

  ・外部メモリ上のバイトまたはワード (2バイト) データのうち,同時にアクセスする
   ことが多いものはできるだけ同じ1ロングワード (4バイト) 内にまとめ,1回の
   メモリアクセスで読み書きできるようにする.
   (ただし SH7085 の外部データバスは 8/16/32 ビットから選択できるようなので,
    32ビット・データバスでなければ効果がない.)

(5) (特に多次元) 配列は添字ではなくポインタでアクセスする.
  受信バッファとして,チャネル番号,サンプル番号等を添字とする多次元配列が多用され,
  それらを添字でアクセスしている.多次元になるほど,添字から配列要素のアドレスを
  計算する手間がかかるので,なるべく添字ではなくポインタでアクセスする.

(6) パイプライン的なデータ処理の高速化
  A/D 変換したデータに対し,ノイズ除去,移動平均,平滑化などの信号処理をパイプライ
  ン的に行っている.これらは別々の関数として実装されており,したがって別々のループ
  で処理されるが,わかりやすく再利用しやすい反面,実行速度はイマイチ (のはず).

  これらの処理を1つのループに融合し,入力データから一気に最終データまで計算する
  方が,途中結果をいちいち (外部) メモリに書き出して後でまた読み込む,ということを
  何度も繰り返す必要がなくなる.また,CPU 内の演算パイプラインが効くようになるはず
  なので,その分の高速化も期待できそう.
  (余談:参照の局所性も高まるので,データキャッシュのある CPU ならさらに効果的.
   以前同様のことを画像処理 (多数の画像を演算して1枚の画像を作成する) で行った
   ことがある.)

(7) 不必要なバッファコピーが多い.
  処理の都合上,受信バッファから最終的な出力バッファの間に中間バッファが存在し,
  コピーを複数回行っている.中間バッファを使用せず,受信バッファから直接出力バッ
  ファにコピーできないか.

(8) 同じような処理がやたら多い.
  多数のバッファのそれぞれについて,それらをリングバッファとして使うためのコード
  が書かれている.リングバッファの処理を共通化すれば,コードサイズが小さくなって
  ROM の使用量が減るとともに,命令キャッシュの効きが良くなるかもしれない.おまけに
  ソースもわかりやすくなるはず.それ以外にも,共通化できる処理はできるだけ共通化する.

(9) 内蔵 RAM (32KB) に配置するデータは極力無駄を省き,できるだけ多くのデータを内蔵
  RAM に置けるようにする.ブール型の変数1個に4バイト整数丸ごと使うなんて論外!

調べればまだ他にも改善点が出てきそうですが,とりあえずこの辺で.

私も今月から SH7085 + NORTi を使い始めました.
昔8ビットマイコンを自作したことはありますが,本格的な組込みの仕事は初めてです.

新しい A/D,D/A 変換基板用に別の人が作りかけていたソフトと,
その元になったソフト (別の基板用に基板メーカが作成したもの) を渡されて,
「まずハードウェアの評価をしないといけないので,とりあえず至急これを動かしてくれ」
と言われ,ようやく先日完成しました.

その過程で,あまり効率の良くないコードがたくさん目に付いたので,
製品版のソフトを開...続きを読む

QH8 マイコン セクションの設定について

最近H8/3694Fを使ってマイコンの勉強をしております。
HEWを使ってコンパイルするときのセクションの設定に
ついて質問があります。

プログラム・セクションの設定を一通り終え、ビルドすると
「L2321 (E) section "S" overlaps sction "P"」
とエラーメッセージが出てしまいました。

色々調べてみるとSはスタック領域、Pはプログラム領域
でこれに重なりができてしまっているようなのですが、
これ以上どうしてよいのかわからず困っています。

おそらくセクション設定を変更すればよいと思っていますが
プログラム領域にどれくらい、スタック領域にどれくらい
を配置すればいいというのはどうやって求めればよいのでしょう?
HEWのメモリマップを表示させて見る方法があるようですが
見てもいまいちわかりませんでした。

使用環境:OS:WindowsXP、HEW4.04.01.001

以上、追記補足いたします。詳しい方教えていただけないでしょうか

Aベストアンサー

実際のリンク結果のアドレスマップは、「Standard Toolchain」の最適化リンカのオプションを変更すれば出力できるはずです。
「リンクマップファイル」がキーワードでマニュアル等を探してみてください。うまく行けば、[プログラム名].mapの名前で作成されるはずです。

>「L2321 (E) section "S" overlaps sction "P"」
RAMで実行する設定にしたなら、このエラーも納得です。
プログラムが本当に大きすぎるんだと思います。
>0X0000FE80 S
となっていますので、設定を変えていないと0x100サイズのスタックが取られるらしいので、0xFD80-0xFE80はスタックになります。
プログラムの部分のPセクションが、0xFD80を超えてしまっていると思いますよ。

Q構造体のextern方法

C++のビギナーなのですが、
普通の変数、配列のexternはできているのですが、
構造体をexternができずに困っています。

2時間ほど調べまわったのですが、
typedefを使わなければならない(?) とか
構造体は変数なんかと違い、特別なやり方をしないとダメらしい事までは解ったのですが、
実際動くやり方を見つけきれませんでした;

方法(手順)や、解説サイトなどをご存知でしたら、教えて頂けると幸いです。

Aベストアンサー

まさか, 「実体を定義していない」というオチはないよなぁ....

QSH3のアセンブラの表記について

 SH3のマニュアルでは、MOVの表記は、MOV.L@(disp,PC),Rnになっています。
ところが、エミュレータの逆アセンブラの表記は、MOV.L@(xxxx:8,PC),Rn
となっています。xxxxのアドレスから、どのアドレスの値を持ってくるの
でしょうか????

Aベストアンサー

>逆アセンブラで、1000番地にMOV.L@(0018:8,PC),R15と表記されているとき
>これを実行後、R15の値は、PC+001Cつまり101Cから4バイトがR15に
>入ってしまうのですが、どういう計算なのでしょうか?。
確たる自信をもってはいませんがSHは完全RISCパイプラインアーキテクチャ
のため、1000番地に上記命令があり、これを「実行している」とき既にPCは
2個先の命令のデコードの所にあり1004になっているからではないですか?
1004+0018->101Cということです。
ちなみにSHの遅延分岐は御存知ですか?例えば
MOV#0,R0
BRALABEL
MOV#1,R0
LABEL:
ADD#1,R0
<- この時点でR0は2になる。
これもBRA命令の「実行の時点」でPCは+4されていると考えられない
でしょうか?
# SHでアセンブラ書くのは、これだから嫌~ン。

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む


人気Q&Aランキング