作者 主題: 組語問題  (閱讀 7426 次)

0 會員 與 1 訪客 正在閱讀本文。

努力學好程式

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
組語問題
« 於: 2005-02-25 13:21 »
小弟工讀期間一個念機械的朋友請我幫他寫個膨脹閥(四線馬達.非五線)的程式.用8051外加鍵盤.lcd.93c46.及那顆該死的馬達(花了我好久的時間才轉起來).時至今日脫著疲憊的身驅總算大工告成.但是有個問題一直暗地取笑我的無能.當鍵盤輸入百位時.鍵值會存在位址56H.十位存在57H.個位存在58H.最後呼叫副程式將三個數值相加放在59H.最後把加總的值拿來當迴圈數就是步數.寫完後快快樂樂的拿給朋友跑以後.神奇的事發生了.若是個位數的話步數正確.但十位時按010沒錯但020多了一步按030多了兩部按了090多了8步.百位的情況也一樣.也是有規律的多了幾步.後來知道規律後.就笨笨的加了一堆程式還不敢給朋友知道.雖然成功了.但多多少少還是有些遺憾.因為我沒KEIL C正版的所以程式超過2K就沒責了.所以請各位先進幫幫看我的問題在哪.PS鍵值是16進制.所以是16進制的加法
以下是程式碼:
ust try it

努力學好程式

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
組語問題
« 回覆 #1 於: 2005-02-25 14:05 »
;-------百位--------
HUN1:   PUSH   A                               ;百位鍵值
   MOV   R2,#100                     ;加自己100次
   MOV   R3,A
TI1:   ADD   A,R3
   DJNZ   R2,TI1
   MOV   56H,A
   POP   A
   RET
;-------十位---------
HUN2:   PUSH   A                               ;十位鍵值
   MOV   R2,#10                      ;加自己10次
   MOV   R3,A
TI2:   ADD   A,R3
   DJNZ   R2,TI2
   MOV   56H,A
   POP   A
   RET
--------個位--------
HUN3:   PUSH   A
   MOV   58H,A
   POP   A
   RET
;-------加總--------
SUM1:   PUSH   A
   MOV   A,56H
   MOV   R5,57H
   MOV   R6,58H
   ADD   A,R5
   ADD   A,R6
   MOV   59H,A
   POP   A
   RET

;-------正轉---------------------
CW:          ACALL   CLRLCD              
   MOV     A,#83H
                ACALL   INS
                MOV     COUNT,#16
                MOV     DPTR,#MSG6
                ACALL    STR
   
   MOV   R1,59H          ;加總當迴圈數
   MOV   A,#99H
LOOP:   DJNZ   R1,LOOP2      ;run
   AJMP   MENU
LOOP2:   MOV   P2,A              ;馬達給我跑
   ACALL   DELAY2          ;一秒動一步
   RR   A
   SJMP   LOOP
ust try it

kowala

  • 憂鬱的高中生
  • ***
  • 文章數: 123
    • 檢視個人資料
組語問題
« 回覆 #2 於: 2005-02-27 15:30 »
這樣不知行不行,我只能紙上作業...
代碼: [選擇]
;-------百位--------
HUN1: PUSH AX                              
MOV AX,100            ;乘100
MUL A                 ;百位鍵值
MOV 56H,AX            ;百位結果放進 56H
POP AX
RET
;-------十位---------
HUN1: PUSH AX                              
MOV AX,10             ;乘10
MUL A                 ;十位鍵值
MOV 57H,AX            ;十位結果放進 57H
POP AX
RET
--------個位--------
MOV 58H,A
RET
;-------
SUM1: PUSH AX
MOV AX,0
ADD AX,56h
ADD AX,57h
        ADD     AX,58h
MOV 59H,AX
POP AX
RET

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
組語問題
« 回覆 #3 於: 2005-03-01 09:30 »
引述: "努力學好程式"

;-------十位---------
HUN2:   PUSH   A                               ;十位鍵值
   MOV   R2,#10                      ;加自己10次
   MOV   R3,A
TI2:   ADD   A,R3
   DJNZ   R2,TI2
   MOV   56H,A
   POP   A
   RET


也許是你post上來打錯,上面的56H,
照你說法應該是57H。

努力學好程式

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
組語問題
« 回覆 #4 於: 2005-03-01 10:45 »
引述: "kowala"
這樣不知行不行,我只能紙上作業...
代碼: [選擇]
;-------百位--------
HUN1: PUSH AX                              
MOV AX,100            ;乘100
MUL A                 ;百位鍵值
MOV 56H,AX            ;百位結果放進 56H
POP AX
RET
;-------十位---------
HUN1: PUSH AX                              
MOV AX,10             ;乘10
MUL A                 ;十位鍵值
MOV 57H,AX            ;十位結果放進 57H
POP AX
RET
--------個位--------
MOV 58H,A
RET
;-------?#91;總--------
SUM1: PUSH AX
MOV AX,0
ADD AX,56h
ADD AX,57h
        ADD     AX,58h
MOV 59H,AX
POP AX
RET


好阿!老奸~用乘法.可是感覺怪怪的
ust try it

努力學好程式

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
組語問題
« 回覆 #5 於: 2005-03-01 10:46 »
引述: "thyme"
引述: "努力學好程式"

;-------十位---------
HUN2:   PUSH   A                               ;十位鍵值
   MOV   R2,#10                      ;加自己10次
   MOV   R3,A
TI2:   ADD   A,R3
   DJNZ   R2,TI2
   MOV   56H,A
   POP   A
   RET


也許是你post上來打錯,上面的56H,
照你說法應該是57H。


剛看了一下~的確是放在57H.
ust try it

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
組語問題
« 回覆 #6 於: 2005-03-01 14:55 »
引述: "努力學好程式"
;-------百位--------
HUN1:   PUSH   A                               ;百位鍵值
   MOV   R2,#100                     ;加自己100次
   MOV   R3,A
TI1:   ADD   A,R3
   DJNZ   R2,TI1
   MOV   56H,A
   POP   A
   RET


A一開始就有值了,你再加一百次的R3,
那就是101倍的A了。

kowala

  • 憂鬱的高中生
  • ***
  • 文章數: 123
    • 檢視個人資料
組語問題
« 回覆 #7 於: 2005-03-01 16:49 »
引述: "努力學好程式"

好阿!老奸~用乘法.可是感覺怪怪的


用乘法可能會溢位,但你的值最大到 999,所以不管溢位問題啦
你用 (jmp + add)100 次,耗掉 (14+2)*100 clock times
用乘法才 14 clock times...

管它什麼法,能動就是好法...
你粉幽默,我喜歡.
呵呵...

努力學好程式

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
組語問題
« 回覆 #8 於: 2005-03-02 10:42 »
引述: "thyme"
引述: "努力學好程式"
;-------百位--------
A一開始就有值了,你再加一百次的R3,
那就是101倍的A了。


一針見血~謝謝你囉!
ust try it

努力學好程式

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
組語問題
« 回覆 #9 於: 2005-03-02 10:49 »
引述: "kowala"
引述: "努力學好程式"

好阿!老奸~用乘法.可是感覺怪怪的


用乘法可能會溢位,但你的值最大到 999,所以不管溢位問題啦
你用 (jmp + add)100 次,耗掉 (14+2)*100 clock times
用乘法才 14 clock times...


哈~最近他老闆叫它改成四位數的.就是多了千位.如果用我的方法不就(14+2)*1000. 總之還是多謝你啦..因為之前雖然知道乘法的指令.不過卻不敢用.
ust try it

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
組語問題
« 回覆 #10 於: 2005-03-02 11:43 »
引述: "努力學好程式"
引述: "kowala"
引述: "努力學好程式"

好阿!老奸~用乘法.可是感覺怪怪的


用乘法可能會溢位,但你的值最大到 999,所以不管溢位問題啦
你用 (jmp + add)100 次,耗掉 (14+2)*100 clock times
用乘法才 14 clock times...


哈~最近他老闆叫它改成四位數的.就是多了千位.如果用我的方法不就(14+2)*1000. 總之還是多謝你啦..因為之前雖然知道乘法的指令.不過卻不敢用.


我沒是用過8051,只用過x86及ARM的,但一個JMP和一個乘法需要
相同的14個clock?好奇怪的設計法!
我個人經驗,在組語世界裡,除非特殊大量浮點數運算需求,
如多媒體,在大部份情況下,感覺不出用加法和乘有什麼速度上的不同。
另外,以9000為例,為什麼一定要9加1000次,不能1000加九次呢?

kowala

  • 憂鬱的高中生
  • ***
  • 文章數: 123
    • 檢視個人資料
組語問題
« 回覆 #11 於: 2005-03-03 21:48 »
我也不知為何jmp要14 clock...
那本組合語言字典是這樣寫的...
我也覺得很怪...
但是用迴圈做也是可以的啦
現在 CPU 都是 GIGA 級的
連 VB 都跑的動了,何況組合語言
就算我們中間再多加幾個 nop
也算剛好而已... ^^