
C言語ならわたしはわかるのですが、アセンブラは理解できるレベルにありません。機会があればいつか挑戦したいです。話は変わりますが、
以下のアセンブラのソースでLEDの点滅まで出来ましたが、これをC言語で理解したいと思っています。翻訳できる方がいらっしゃればご協力のほどよろしくお願いします。また、そこまでは無理でもわかる範囲でアドバイスを戴けたらと思います。よろしくお願いします。
asmソースです。
listp=16f628a
#include<p16f628a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT &
_MCLRE_OFF & _LVP_OFF
w_temp EQU 0x70
status_temp EQU 0x71
CNT1 EQU 0x20
CNT2 EQU 0x21
ORG 0x000
goto main
ORG 0x004
movwf w_temp
movf STATUS,w
movwf status_temp
;ISR Codes
movf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie
main
bcf STATUS,RP0
bcf STATUS,RP1
clrf INTCON
clrf PORTA
movlw 0x07
movwf CMCON
bsf STATUS,RP0
bsf PCON,OSCF
clrf TRISA
clrf TRISB
bcf STATUS,RP0
clrf PORTA
clrf PORTB
main_loop
bsf PORTB,3
call DLY_250
bcf PORTB,3
call DLY_250
goto main_loop
;Delay Routine
DLY_250 ; 250ms
movlw d'250'
movwf CNT1
DLP1;1ms
movlw d'200'
movwf CNT2
DLP2
nop
nop
decfsz CNT2,f
goto DLP2
decfsz CNT1,f
goto DLP1
return
END
No.1ベストアンサー
- 回答日時:
PICはかじった程度です。
質問されている内容のアセンブラをC言語に変換する事を目的とされているのでしたら、余りお勧めいたしません。と、言うのもコンパイラーの仕様や定義されているビルトインの関数の仕様がわからないとどのように変換されるか予測が付かないためです。
そこを承知の上ででしたら、少しヒントになるかと思う擬似的なコードは書けると思います。
が、しかし満足できる形で動くかわかりません。
まず、EQUで書かれている部分をdefineに置き換えます。
#define w_temp 0x70
・・・(省略)・・・・
基本的に各アセンブラのニモニックに対応したC言語用の低級関数が用意されていると思いますからそれをつかって記述する事になると思います。
main(){
bcf
clrf
などで宣言されている部分
bsf
などで、PICの動作設定を行う部分STATUSレジスタへ設定する部分
clrf
などでポートの初期化を行う部分を記述します。
次に
while(1){
bsfでportbの3ビット目をセットする部分
DLY_250()関数を呼び出す部分
bsfでportbの3ビット目をクリアする部分
DLY_250()関数を呼び出す部分
}
}//main()関数の終了
DLY_250(){ //プロトタイプ宣言できないのであればmain()関数の前に書くとよいでしょう
unsigned int CNT1,CNT2;
for(CNT1=250;CNT1<=0;CNT1--){
for(CNT2=200;CNT2<=0;CNT2--){
nop;//nopを発行する関数を呼び出す
nop;//同上
}
}
}//DLY_250の終了
ORG 0x004から開始するアセンブラの部分及びISR Codeの部分はどのように設定するのかわかりません。コンパイラのprecompileの部分で指定するか、GUIなどがあればオプションで設定できるのかもしれません。または、ヘッダーに記述する事で解決するかもしれません。
こんな感じでしょうか。参考までに。
お忙しいところ、ご親切にありがとうございます。とりあえず、picが動作したので一安心しています。今後について、折角なので、書籍を買ってアセンブラを覚えようと思います。picがあるので難しいですが、敷居は少し低くなった感じです。そして、アセンブラが解るようになれば、改めてc言語でチャレンジしようと思います。予定は未定ですけれども頑張りたいと思います。有難うございました。
No.2
- 回答日時:
> C言語ならわたしはわかるのですが、アセンブラは理解できるレベルにありません。
> 以下のアセンブラのソースで
VisualStudioのソースでとか言わない気もしますが。
CコンパイラはC言語のソースを機械語に翻訳するソフト。
アセンブラはアセンブリ言語で書かれたソースを機械語に変換するソフト。
『アセンブラを理解』ってソースから機械語が類推できるみたいな感じでも使いますよね。
普通は++n;で機械語のコードが類推できないと思う(コンパイラの動作は解らない)
『C言語ならわかる』『アセンブラは理解できるレベルに』右と左で同様のものをいってない。
片方はソフトの処理について、もう片方は言語のソースについていっているのですよね。
#include<p16f628a.inc>
上記はC言語にもある #includeと同じものですね。
> __CONFIG _CP_OFF &
> _WDT_OFF &
> _BODEN_ON &
> _PWRTE_ON &
> _INTRC_OSC_NOCLKOUT &
#includeした部分で定義されているはずです。どのアドレスやポートにどんなデータを書き込んでいるなど具体的な動作はincludeするファイルを見れば解るかと思います。
CNT1 EQU 0x20
xxx EQU yyy
はxxxにアドレスを割り当て、その内容をyyyとするなので
#define CNT1 0x20
に近いが同じではありません。(gotoの飛び先としてxxxを使っている様な場合にはとか)
int CNT1=0x20;
の方が近い気もします。(#defineだと定義されたCNT1の書き換えは不能だけどCNT1はアドレスを割り当てられ値を書き込む事も可能かと)
アセンブリ言語はCPUに依存しますので16F628Aなら16F628Aの命令表(ニーモニック表)など(CPUの資料)を見ればC言語との対応が解るかと思いますよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Arduinoに関する質問 4 2023/08/07 21:19
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- メディア・マスコミ マスクしつづける方は 緊急事態条項・パンデミック条約について どう捉えていますか? 2 2023/03/21 11:44
- 医療・安全 マスクしつづける方は 緊急事態条項・パンデミック条約について どう捉えていますか? 8 2023/03/18 20:27
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- その他(言語学・言語) 「核を落とされる前に使え」ゼレンスキーのウクライナ語の翻訳 の確認 3 2023/05/23 09:06
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- 事件・犯罪 プリキュアの着ぐるみを被った変態について 1 2023/08/10 16:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
プログラマー達は何故、プログ...
-
C#でTreeViewのCheckBoxのサイ...
-
最初に聞かれたこと
-
visual studio 2022でのC#プロ...
-
【C言語】全角文字の配列を、全...
-
VisualStudio2022でC言語プログ...
-
C++でデスクトップGUIアプリ開...
-
大量のデータを読み込んで表示...
-
プログラム言語について c言語...
-
C#でログファイルにファイルパ...
-
c言語
-
C言語 1から20までの逆数の和を...
-
C言語の関数のextern宣言
-
あってる
-
UART通信の取説で,left floati...
-
逆コンパイルと逆アセンブルの...
-
右ビットシフト
-
C言語 バッファについて。
-
データの外挿について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ライン数とステップ数の違いは?
-
アセンブラからC言語に変換する...
-
実行ファイルからソースはみれる?
-
アセンブラ言語がわかりません。
-
[C言語→アセンブリ言語]はどう...
-
アセンブラの配列処理
-
素朴な疑問 (C言語とアセン...
-
アセンブラwordという単位
-
PowerPC用逆アセンブラを知りま...
-
アセンブラエディタ
-
このアセンブラの意味を教えて...
-
PICはアセンブラとC言語のどち...
-
MPLAB IDE v8.92アセンブラにつ...
-
x86系でリアル←→プロテクトモー...
-
メモリアドレスについて
-
素数を求めるプログラム(アセン...
-
アセンブラで割り算
-
アセンブラのリンカのダウンロ...
-
【H8マイコン】HEWで埋め込みア...
-
アセンブラーのプログラムに関して
おすすめ情報