|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
牛人進來下,幫我看下這段程序哪出錯了 |
| 作者:tuzi148 欄目:單片機 |
哪位高手指教下下面的程序哪方面有錯誤的,先謝謝了啊 編輯匯編和調試找最大數程序;要求:將數據表存入60H單元開始的內部RAM區(qū),該表的長度存入70H單元,找出最大數并存在71H單元中,最大數的地址存在72H中 ORG 8000H AJMP MAIN ORG 8200H MAIN:MOV SP,#30H MOV R0,#60H MOV R1,70H CLR A MOV R2,A LOOP: MOV A,@R0 CLR C SUBB A,@R0 JC NEXT MOV A,@R0 MOV R2,A MOV 72H,R0 NEXT: INC R0 DJNZ R1,LOOP MOV 71H,R2 HERE: SJMP HERE END * - 本貼最后修改時間:2006-11-6 12:21:05 修改者:tuzi148 |
| 2樓: | >>參與討論 |
| 作者: tuzi148 于 2006/11/6 11:00:00 發(fā)布:
高手快來啊 怎么都沒人來呢,快來啊 |
|
| 3樓: | >>參與討論 |
| 作者: lws 于 2006/11/6 11:10:00 發(fā)布:
沒覺得有什么錯 如果要驗證程序功能,把起始地址定位到0000H,軟件仿真一下即可.為什么要把起始地址放在8000h, |
|
| 4樓: | >>參與討論 |
| 作者: xplore 于 2006/11/6 11:13:00 發(fā)布:
你不說說你的程序想干什么 |
|
| 5樓: | >>參與討論 |
| 作者: tuzi148 于 2006/11/6 12:23:00 發(fā)布:
這是我們的作業(yè)題來的 我才是剛學這個單片機的,所以好多東西都不懂,上面這個是老師給我們上機用的,老師說這段程序有點錯誤,讓我們改了后再去上機 |
|
| 6樓: | >>參與討論 |
| 作者: guet 于 2006/11/6 13:41:00 發(fā)布:
試試這樣 ORG 8000H AJMP MAIN ORG 8200H MAIN:MOV SP,#30H MOV R0,#60H MOV R1,70H CLR A LOOP: MOV R2,A CLR C SUBB A,@R0 JC NEXT MOV A,R2 SJMP NEXT1 NEXT: MOV A,@R0 MOV 72H,R0 NEXT1:INC R0 DJNZ R1,LOOP MOV 71H,R2 HERE: SJMP HERE END |
|
| 7樓: | >>參與討論 |
| 作者: jzlidengbo 于 2006/11/6 13:55:00 發(fā)布:
作業(yè)還是要自己做的好! 應該是在關于70H那有錯誤!好像沒有定義數表的長度!現在你那語句送進去的應該是00H! 應該自己多琢磨,這樣才能進步快!歡迎去http://c51.lgbar.com多交流!單片機的論壇 |
|
| 8樓: | >>參與討論 |
| 作者: xhtxzxw 于 2006/11/6 21:12:00 發(fā)布:
我絕對足夠相當的羅嗦 ORG 8000H AJMP MAIN ORG 8200H MAIN:MOV SP,#30H 。桓惴o關,但不算錯 MOV R0,#60H ;取數據表首址到R0,涉及到內部RAM表操作的時候幾乎總要用到R0或R1,以便做間接尋址 MOV R1,70H; ;取數據表長度(表項數)到R1 CLR A ;首先假定一個最大值0,不考慮符號的話,沒有更小的了 MOV R2,A ;暫時放到R2 LOOP: MOV A,@R0 ;參見前面說的間接尋址 CLR C ;51的減法指令總是帶借位的,清C,保證不會出錯 SUBB A,R2 ;這里改了!R2里放著在此之前的最大值 JC NEXT ;如果產生借位了,說明R2里原來那個所謂的最大值比A里的值大,所以R2里的東西不用改變,跳轉到NEXT,繼續(xù)對后面的數做判斷 MOV A,@R0; 程序如果走到這里了,說明剛才的SUBB操作沒有產生借位,A里內容至少不比R2里的東西小,A的內容成為新的老大 MOV R2,A ;于是A里的東西(新的老大)跑到R2去了 MOV 72H,R0;;注意新的老大是用“MOV A,·R0”取來的,也就是說當前老大的地址在R0里 NEXT: INC R0; 數據表項地址增量,以便繼續(xù)判斷下一個數據 DJNZ R1,LOOP;表項數減一,控制循環(huán)次數 MOV 71H,R2;最后把找到的真正的老大放到72H單元里 HERE: SJMP HERE END |
|
| 9樓: | >>參與討論 |
| 作者: xhtxzxw 于 2006/11/6 21:15:00 發(fā)布:
改錯 MOV 72H,R0;;注意新的老大是用“MOV A,@R0”取來的,也就是說當前老大的地址在R0里 NEXT: INC R0; 數據表項地址增量,以便繼續(xù)判斷下一個數據 DJNZ R1,LOOP;表項數減一,控制循環(huán)次數 MOV 71H,R2;最后把找到的真正的老大放到71H單元里 HERE: SJMP HERE END |
|
| 10樓: | >>參與討論 |
| 作者: yanfengzhu 于 2006/11/6 21:54:00 發(fā)布:
作業(yè)都拿上來,現在的年頭。 |
|
| 11樓: | >>參與討論 |
| 作者: tuzi148 于 2006/11/6 22:12:00 發(fā)布:
不說什么了,一句話,謝謝大哥了啊 謝謝老大 |
|
| 12樓: | >>參與討論 |
| 作者: conwh 于 2006/11/7 0:50:00 發(fā)布:
表是從60H開始的,長70H個,可最大數及指針卻放到70H、71H 這樣就會產生丟失數據的?纯催@個程序是否有幫助。 DATA_START EQU 60H DATA_LEN EQU 70H DATA_MAX EQU xx DATA_MAX_ADD EQU xx : MOV DATA_MAX, #0 MOV R0, #DATA_START MOV R2, #DATA_LEN COMP-DATA: MOV A, @R0 CJNE A, DATA_MAX, EX-DATA COMP-DATA-1: INC R0 DJNZ R2, COMP-DATA : EX-DATA: JC COMP-DATA-1 MOV DATA_MAX, A MOV DATA_MAX_ADD, R0 SJMP COMP-DATA-1 * - 本貼最后修改時間:2006-11-7 1:02:32 修改者:conwh |
|
| 13樓: | >>參與討論 |
| 作者: dengm 于 2006/11/7 12:08:00 發(fā)布:
re: 例子, DATA_START equ 60H DATA_LEN data 70H DATA_MAX data 71h DATA_MAX_ADD data 72h STACK_BUF EQU 73H ORG 0000H LJMP MAIN ORG 8000H MAIN: MOV SP, #(STACK_BUF-1) ; MAIN_LOOP: ; CALL SUB_MAX_NUM ; ..... ; ..... JMP MAIN_LOOP SUB_MAX_NUM: MOV R0, #DATA_START ; LOAD START_ADDR TO INDEX R0 MOV DATA_MAX, #000H ; INIT MAX_NUM TO 000H MOV R2, DATA_LEN ; DATA NUM FOR LOOP MAX_MUN_L1: MOV A, @R0 ; LOAD ONE DATA CLR C ; SUBB THE MAX_NUM SUBB A, DATA_MAX JC MAX_NUM_A ; IF MAX_NUM <= the data then do ... MOV DATA_MAX_ADD, R0 ; save max_add MOV A, @R0 ; save max_num MOV DATA_MAX, A MAX_NUM_A: INC R0 ; inc the index to next data DJNZ R2, MAX_NUM_L1 ; loop to do next data until r2=0 RET ;.... ;.... END * - 本貼最后修改時間:2006-11-7 12:11:17 修改者:dengm |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |