[C言語] レジスタ値の変化

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

アセンブル言語のコードを解読するため、LLDBを使ってレジスタ値の変化を表にまとめました。黄色のセルで値が変わっています。

register readコマンドでmain関数先頭行でのレジスタ値を出力し、nextコマンドで1行ずつ進めて都度レジスタ値を出力しました。

#include <stdio.h>

int main() {
    int i = 1000;
    char c[6] = {'a', 'b', 'c', 'd', 'e'};
    char* c_ptr = 'xyz';
    char* c_ptr2 = "stu"; // あえてダブルクォートを使用

    printf("i: %d\n", i);
    printf("c: %s\n", &c);
    printf("c_ptr: %s\n", &c_ptr);
    printf("c_ptr2: %s\n", &c_ptr2);

    return 0;
}

[C言語] 変数の格納アドレス検証 char

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]
# LLDB # コマンド

LLDBを使って変数のアドレスを調べています。

ゆくゆくはアセンブリ言語で簡単なコードを書くつもりなので、C++ではなくC言語で書いていきます。

今回はchar、char*について調べました。ポインタ自身のアドレスがわからなかったのですが、memory readコマンドの結果を照らし合わせて突き止めることができました。

下図の青線で囲んだところがポインタのようです。メモリアドレスが書かれています。変数にほぼ隣接した下位側に位置しています。

#include <stdio.h>

int main() {
    int i = 1000;
    char c[6] = {'a', 'b', 'c', 'd', 'e'};
    char* c_ptr = 'xyz';

    printf("i: %d\n", i);
    printf("c: %s\n", &c);
    printf("c_ptr: %s\n", &c_ptr);

    return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
i: 1000
c: abcde
c_ptr: zyx // なぜ逆さになるのかは不明