アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

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などがあればオプションで設定できるのかもしれません。または、ヘッダーに記述する事で解決するかもしれません。

こんな感じでしょうか。参考までに。
    • good
    • 0
この回答へのお礼

お忙しいところ、ご親切にありがとうございます。とりあえず、picが動作したので一安心しています。今後について、折角なので、書籍を買ってアセンブラを覚えようと思います。picがあるので難しいですが、敷居は少し低くなった感じです。そして、アセンブラが解るようになれば、改めてc言語でチャレンジしようと思います。予定は未定ですけれども頑張りたいと思います。有難うございました。

お礼日時:2011/04/02 23:56

> 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言語との対応が解るかと思いますよ。
    • good
    • 0
この回答へのお礼

回答有難うございました。返事が遅れて申し訳ありませんでした。

お礼日時:2011/04/07 20:51

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