問題タブ [c51]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 値を宛先アドレスに移動 (C51 ファミリー)
さまざまなデータがあるテーブルを作成しました。このテーブルからデータを取り出して変更し、同じ位置に書き戻す必要がありますが、何らかの理由でデータがその位置に書き込まれません
これが私のコードです
コードをループすると、A は 0 から 100 から 120 になり、アドレス 3 (テーブルの位置 0) に書き込んで、再度取得し、さらに 20 を追加する必要があります。次のように動作します。
私が実際に必要としているのは、メモリ位置にアクセスし、それを変更してから更新する方法です。これ:
私はさまざまなものを読んでいますが、うまくいく答えを見つけることができませんでした。たとえば、ここでは指示を示していますが、出力例は示していません: http://www.keil.com/support/man/docs/is51/is51_mov.htm
編集:必ずしもこのように使用する必要はありません。Cのように変数を持ち、次のようなことをする方法が必要です:
int 変数 = 100;
for(;;) var += 20;
c - C51で配列を含む構造体を定義することは許可されていませんか?
C51 の配列を含む構造体は許可されていませんか? C51 プログラムで単純な構造を定義した後、
エラーが発生しました: ..\SOURCE\MYRINGBUFFER.H(25): error C141: syntax error near '['
。エラーが構造体で定義された char 配列を含む行にあることは明らかです (コメント後にエラーはありません)。
ここで何か間違ったことをしていますか?そうでない場合、私がやろうとしていることを達成できる方法はありますか?
編集:すべてのコード。
function - Keil C51: 同じ名前でパラメータが異なる関数のバグの可能性はありますか?
すでに解決されているので、これは実際には問題ではありません。しかし、誰かが同じ問題に遭遇する可能性があるため、ここで共有したいと思います。そして、私はこれについてもっと深い説明を得たいと思っています.
私は Keil μvision3 を使用して C8051F340 でプログラムしています (これはこの質問とは無関係だと思います)。私のmain.cには次のようなものがあります:
およびmobile.cで(無関係なヘッダー、インクルード、blablabla を無視します):
そして、それは大丈夫でした。ただし、コードにいくつかの変更を加えた後、
コンパイルとチップへのダウンロードはエラーなしで終了しました。私は警告を見つけましたが:
*** 警告 L2: 未解決の外部への参照
シンボル: GETINPUT
しかし、私は少し怠け者でしたし、同僚は他の多くの警告を受けて読むことができませんでした (悪い癖です!)。
私が学びたいこと:
- なぜ Keil はそのようなものをエラーなしでコンパイルできるのですか (C では、間違いなくエラーが宣言されていない関数である必要があります)。
- REFERENCE MADE TO UNRESOLVED EXTERNALは何と言っていますか? 同じ名前の関数が見つかりましたが、パラメーターが異なるために解決できませんでしたか、それともプロジェクト内の存在を確認せずに関数を許可するだけですか? そこからアセンブリ コードを生成する方法が見つからなかったので、よくわかりません。
c - array [] vs pointer * - C で最初のコードが失敗するのはなぜですか?
Keil C51 コンパイラを使用して 8051 マイクロコントローラをプログラムしています。なんらかの理由でコードが実行されませんでした。バグを突き止めることはできましたが、まだ理解に苦慮しています。他のコードと比較して、最初のコードが間違っているのはなぜですか? コンパイラがエラーをスローしなかったことは注目に値します。コードはマイクロコントローラー上で開始さえしませんでした。
不正なコード:
file1.h
file2.c
これらを次のように変更した後:
file1.h
file2.c
それは働き始めました。
また、コードのこの部分は「array_var[0].property = ...」などの関数でのみ参照されていましたが、これらの関数はいずれもアプリケーションから呼び出されていませんでした。
some_struct 変数は、さらに別のモジュールで宣言されています。
なぜそのように振る舞うことができたのでしょうか?[] と * の違いはありますか?
EDIT1: ポインターと配列は別物だと言われていますが、「[]」構文は「*」とどう違うのでしょうか? 角括弧が空の場合(関数の引数の場合と同様)、コンパイラはそれをポインターに変換するだけだと思いました。また、配列を提供すると、最初の要素のアドレスが得られると思いました。
現在、誰もがポインターと配列が異なると言っていますが、それらの正確な違いに関する情報は見つかりません。配列を最初の要素へのポインターではなく右辺値として指定すると、コンパイラーはそれをどのように認識しますか?
keil - Keil C51 8051 ポート 0 I/O
Keil C51 でこの 2 つのケースを確認し、両方のケースのデバッガーで P0 ペリフェラル オプションを観察します。結果は 2 つのケースで異なります。なぜ P0=0xFF; 命令は同じ結果を生成しませんか?
ケース1)
ケース 2)
ケース 1 プログラム
ケース 1 デバッグ中のペリフェラル ウィンドウ
対象デバイス 89S52 -- 8051 ベースのマイクロコントローラ