[解決済み] ARMで文字列を扱うには?
質問
これは宿題のようなものです。正直なところ、C言語プログラムがどのように文字列パラメータをアセンブリレベルに渡すのかがよくわかりません。
私は、関数
StringSearchInString( text, searchString);
とパラメータ
text = "Hallo Alles klar"
searchString = "ll"
ARMがtext, searchStringのパラメータをそれぞれレジスタR0, R1に渡すことは知っていますが、charactesrの場合はどうなんでしょう。もし各文字の長さが8ビットであれば、入力される文字列によってレジスタは容赦なく虐殺される。
ARMのAPCSは引数をワードに変換し、そのうちの最初の4バイトをレジスタに格納し、残りを逆順にスタックにロードすると読んだことがあります。
スッ...何?よくわからないんだけど。文字列
text
はR0に格納され、最初の4バイト、"Hall"はR0に格納され、残りは逆順にスタックに格納されるのでしょうか?私の理解は正しいのでしょうか?どのように呼び出すのですか?
TL;DR: C プログラムからアセンブリに文字列の引数を渡し、それを使ってどのように作業/ロード/実行しますか?
ANSWER
この件に関しても解決策を探している人がいるかもしれないので、ここに書いておきます。
Greg Hewgillが言っているように、文字列は文字列へのポインタとして渡されます。したがって、R0の値は文字列へのアドレスとなります。したがって、間接アドレッシングを使って、このような値にアクセスするのです。
StringSearchInString( text, searchString ); // calls the ARM function...
//Going into the ARM function...
LDRB R4, [R0], #1 // Load the first value of R0 into R4 and skip
// ahead one character(8 bits)
// Note the "B" in LDR. It indicates that you load ONLY 1 byte!
MOV R0, R4 // Move the value of R4 into R0. This destroys the pointer
// Stored in R0! Careful!
そして成功! もしあなたの文字列が私のように "hallo Alles klar" であれば、レジスタR0に0x68がロードされています。これは"h"のASCII値です。これで、文字列を扱うことができるようになります。
解決するには?
簡単に説明すると、C言語では文字列は
ポインタ
を、どこか別の場所にある文字データに変換します。例えば、R0には
0x01000078
へのポインタと解釈されます。
"Hallo Alles klar"
のデータの後に、ヌル文字(
00
バイト)です。これはARMに限ったことではありません。
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン