




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計2021年10月21日星期四 單片機原理及應用單片機原理及應用西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四第第4章章 匯編語言程序設計簡介匯編語言程序設計簡介 4.1 偽指令偽指令 4.2 匯編語言程序設計匯編語言程序設計 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 偽指令偽指令是匯編程序能夠識別并對匯編過程進行某種控是匯編程序能夠識別并對匯編過程進行某種控制的匯編命令。它不是單片機執(zhí)行的指令,所以沒
2、有對應制的匯編命令。它不是單片機執(zhí)行的指令,所以沒有對應的可執(zhí)行目標碼,匯編后產生的目標程序中不會再出現偽的可執(zhí)行目標碼,匯編后產生的目標程序中不會再出現偽指令。指令。一、起始地址設定偽指令一、起始地址設定偽指令 org格式為:格式為:org 表達式表達式該指令的該指令的功能功能是向匯編程序說明下面緊接的程序段或數據是向匯編程序說明下面緊接的程序段或數據段存放的段存放的起始地址起始地址。表達式通常為。表達式通常為16進制地址,也可以進制地址,也可以是已定義的標號地址。是已定義的標號地址。 4.14.1偽指令偽指令西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 202
3、1年10月21日星期四 org 8000hstart:mov a,#30h 此時規(guī)定該段程序的機器碼從地址此時規(guī)定該段程序的機器碼從地址8000h單元開單元開始存放。始存放。 在每一個匯編語言源程序的開始,在每一個匯編語言源程序的開始,都要設置一條都要設置一條org偽指令來指定該程序在存儲器中存放的起始位置。偽指令來指定該程序在存儲器中存放的起始位置。若省略若省略org偽指令,則該程序段從偽指令,則該程序段從0000h單元開始存單元開始存放。在一個源程序中,放。在一個源程序中,可以多次使用可以多次使用org偽指令規(guī)定偽指令規(guī)定不同程序段或數據段存放的起始地址,但不同程序段或數據段存放的起始地址
4、,但要求地址值要求地址值由小到大依序排列由小到大依序排列,不允許空間重疊。,不允許空間重疊。西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四二、匯編結束偽指令二、匯編結束偽指令 end格式為:格式為:end該指令的該指令的功能功能是結束匯編。是結束匯編。匯編程序遇到匯編程序遇到end偽指令后即結束匯編。處于偽指令后即結束匯編。處于end之后的程序,匯編程序將不處理。之后的程序,匯編程序將不處理。西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四三、字節(jié)數據定義偽指令三、字節(jié)數據定義偽指
5、令 db標號:標號: db 字節(jié)數據表字節(jié)數據表功能功能是從標號指定的地址開始,在是從標號指定的地址開始,在rom中定義字節(jié)數據。字節(jié)數據表可以中定義字節(jié)數據。字節(jié)數據表可以是一個或多個字節(jié)數據、字符串或表達式。該偽指令將字節(jié)數據表中的數是一個或多個字節(jié)數據、字符串或表達式。該偽指令將字節(jié)數據表中的數據根據從左到右的順序依次存放在指定的存儲單元中。一個數據占一個存據根據從左到右的順序依次存放在指定的存儲單元中。一個數據占一個存儲單元。例如:儲單元。例如: org 9000hdata1: db 73h, 01h, 90hdata2: db 02h db abcd,3*25,01h.1 11個數據
6、從個數據從9000h單元連續(xù)存放。單元連續(xù)存放。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四四、字數據定義偽指令四、字數據定義偽指令 dw標號:標號: dw 字數據表字數據表功能功能是從標號指定的地址單元開始,在程序存儲器中是從標號指定的地址單元開始,在程序存儲器中定義定義字數據字數據。該偽指令將字或字表中的數據根據從左。該偽指令將字或字表中的數據根據從左到右的順序依次存放在指定的存儲單元中。到右的順序依次存放在指定的存儲單元中。應特別注應特別注意:意:16位的二進制數,高位的二進制數,高8位存放在低地址單元,低位存放在低地址單元,
7、低8位存放在高地址單元。位存放在高地址單元。例如:例如: org 1400hdata:dw 324ah,3ch 匯編后,(匯編后,(1400h)=32h,(,(1401h)= 4ah,(,(1402h)=00h,(,(1403h)=3ch。西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 在定義中使用在定義中使用dup重復操作符重復操作符 格式如下:格式如下: dup ()例如:例如: zero: db 3dup(0,0)buffer: db ab , 2dup(ba , 3dup(1)西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯
8、編程序設計匯編程序設計 2021年10月21日星期四五、位地址符號定義偽指令五、位地址符號定義偽指令 bit格式為:符號名格式為:符號名 bit 位地址表達式位地址表達式 功能功能是將位地址賦給指定的符號名。其中,是將位地址賦給指定的符號名。其中,位地址表達式可以是絕對地址,也可以是符位地址表達式可以是絕對地址,也可以是符號地址。號地址。例如:例如: st bit p1.0將將p1.0的位地址賦給符號名的位地址賦給符號名st,在其后的編,在其后的編程中就可以用程中就可以用st來代替來代替p1.0。西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日
9、星期四六、賦值偽指令六、賦值偽指令 equ符號名符號名 equ 表達式表達式功能功能是將表達式的值或特定的某個匯編符號定義為一個指定的是將表達式的值或特定的某個匯編符號定義為一個指定的符號名。例如:符號名。例如: len equ 10 block equ 22h mov r7,len mov r0,block命令執(zhí)行后:命令執(zhí)行后:r7=? r0=? 10 22h西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 匯編語言的語句格式匯編語言的語句格式 語句行由四個字段組成語句行由四個字段組成 : 標號:標號: 操作碼操作碼 操作數操作數 ;
10、注釋;注釋 括號內的部分可以根據實際情況取舍。每個字段之括號內的部分可以根據實際情況取舍。每個字段之間要用分隔符分隔,可以用作分隔符的符號有空格、間要用分隔符分隔,可以用作分隔符的符號有空格、冒號、逗號、分號等。冒號、逗號、分號等。如:如:looploop:mov amov a,#7fh #7fh ;a7fha7fh西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四一、標號一、標號標號是語句地址的標志符號,用于引導對該語句的非標號是語句地址的標志符號,用于引導對該語句的非順序訪問。順序訪問。有關標號的規(guī)定有關標號的規(guī)定為:為: 標號由標號由
11、18個個ascii字符組成。第一個字符必須是字母,其字符組成。第一個字符必須是字母,其 余字符可以是字母、數字或其他特定字符;余字符可以是字母、數字或其他特定字符; 不能使用該匯編語言已經定義了的符號作為標號。如指令助記不能使用該匯編語言已經定義了的符號作為標號。如指令助記 符、寄存器符號名稱等;符、寄存器符號名稱等; 標號后邊必須跟冒號。標號后邊必須跟冒號。二、操作碼二、操作碼 操作碼用于規(guī)定語句執(zhí)行的操作。它是匯編語句中唯一不操作碼用于規(guī)定語句執(zhí)行的操作。它是匯編語句中唯一不能空缺的部分。它由指令助記符表示。能空缺的部分。它由指令助記符表示。 西安理工大學課堂教學講稿西安理工大學課堂教學講
12、稿 匯編程序設計匯編程序設計 2021年10月21日星期四三、操作數三、操作數 操作數用于給指令的操作提供數據或地址。在一操作數用于給指令的操作提供數據或地址。在一條匯編語句中操作數可能是空缺的,也可能包括一項,條匯編語句中操作數可能是空缺的,也可能包括一項,還可能包括兩項或三項。各操作數間以逗號分隔。操還可能包括兩項或三項。各操作數間以逗號分隔。操作數字段的內容可能包括以下幾種情況:作數字段的內容可能包括以下幾種情況:(1)工作寄存器名;)工作寄存器名;(2)特殊功能寄存器名;)特殊功能寄存器名;(3)標號名;)標號名;(4)常數;)常數;(5)符號符號“$”,表示程序計數器,表示程序計數器
13、pc的當前值;的當前值;(6)表達式。)表達式。西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四四、注釋四、注釋 注釋不屬于匯編語句的功能部分,它只是對語句的說注釋不屬于匯編語句的功能部分,它只是對語句的說明。注釋字段可以增加程序的可讀性,有助于編程人員的明。注釋字段可以增加程序的可讀性,有助于編程人員的閱讀和維護。閱讀和維護。注釋字段必須以分號注釋字段必須以分號“;”開頭,開頭,長度不限,長度不限,當一行書寫不下時,可以換行接著書寫,但換行時應注意當一行書寫不下時,可以換行接著書寫,但換行時應注意在開頭使用分號在開頭使用分號“;”。五、
14、數據的表示形式五、數據的表示形式 8051匯編語言的數據可以有以下幾種表示形式:匯編語言的數據可以有以下幾種表示形式: 二進制數,末尾以字母二進制數,末尾以字母 b 標識。如:標識。如:1000 1111b; 十進制數,末尾以字母十進制數,末尾以字母 d 標識或將字母標識或將字母d省略。如:省略。如:88d,66; 十六進制數,末尾以字母十六進制數,末尾以字母 h 標識。如:標識。如:78h,0a8h(但但應注意的是,十六進制數以字母應注意的是,十六進制數以字母af開頭時應在其前面加開頭時應在其前面加上數字上數字“0”。);); ascii碼,以單引號括起來標識。如:碼,以單引號括起來標識。如
15、:ab,1245 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 org 1000h tab: db 1,2,3,1,efghi db 2 dup(?) db 2 dup(01h,02h) buf: dw $-tab dup(?),0ffh tt equ buf-tab1000h11001h21002h31003h31h1004h45h1005h46h1006h47h1007h48h1008h49h1009hx100ahx100bh01h100ch02h100dh01h100eh02htt=? tt=15西安理工大學課堂教學講稿西安理工
16、大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2 匯編語言程序設計匯編語言程序設計 4.2.1 簡單程序設計簡單程序設計 例例 1 兩個無符號雙字節(jié)數相加。兩個無符號雙字節(jié)數相加。 設被加數存放于內部設被加數存放于內部ram的的40h(高位字節(jié))(高位字節(jié)), 41h(低(低位字節(jié))位字節(jié)), 加數存放于加數存放于50h(高位字節(jié))(高位字節(jié)), 51h(低位字節(jié))(低位字節(jié)), 和數存入和數存入 40h和和41h單元中。單元中。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四程序如下程序如下: start
17、: clr c ; 將將cy清零清零mov r0, 41h ; 將被加數地址送數據指針將被加數地址送數據指針r0mov r1, 51h ; 將加數地址送數據指針將加數地址送數據指針r1 ad1: mov a, r0 ; 被加數低字節(jié)的內容送入被加數低字節(jié)的內容送入aadd a, r1 ; 兩個低字節(jié)相加兩個低字節(jié)相加mov r0, a ; 低字節(jié)的和存入被加數低字節(jié)中低字節(jié)的和存入被加數低字節(jié)中 dec r0 ; 指向被加數高位字節(jié)指向被加數高位字節(jié) dec r1 ; 指向加數高位字節(jié)指向加數高位字節(jié) mov a, r0 ; 被加數高位字節(jié)送入被加數高位字節(jié)送入aaddc a, r1 ; 兩個
18、高位字節(jié)帶兩個高位字節(jié)帶cy相加相加 mov r0, a ; 高位字節(jié)的和送被加數高位字節(jié)高位字節(jié)的和送被加數高位字節(jié) ret 這一句省略掉可以不?將這一句的addc改為add行嗎?這個程序還可以怎么改?西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 2 將兩個半字節(jié)數合并成一個一字節(jié)數。將兩個半字節(jié)數合并成一個一字節(jié)數。 設內部設內部ram 40h, 41h單元中分別存放著單元中分別存放著 8 位二進制數位二進制數, 要求取出兩個單元中的低半字節(jié)要求取出兩個單元中的低半字節(jié), 并成一個字節(jié)后并成一個字節(jié)后, 存入存入 50h單元
19、中。單元中。 程序如下程序如下: start: mov r1, 40h ; 設置設置r1為數據指針為數據指針 mov a, r1 ; 取出第一個單元中的內容取出第一個單元中的內容 anl a, 0fh ; 取第一個數的低半字節(jié)取第一個數的低半字節(jié) swap a ; 移至高半字節(jié)移至高半字節(jié) inc r1 ; 修改數據指針修改數據指針 xch a, r1 ; 取第二個單元中的內容取第二個單元中的內容 anl a, 0fh ; 取第二個數的低半字節(jié)取第二個數的低半字節(jié) orl a, r1 ; 拼字拼字 mov 50h, a ; 存放結果存放結果 ret 這個程序還可以怎這個程序還可以怎么改呢?么改
20、呢?西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2.2 分支程序設計分支程序設計 圖圖 4.1 分支結構框圖分支結構框圖(a) 單分支流程單分支流程; (b) 多分支流程多分支流程 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四例例 3 x, y均為均為8位二進制數位二進制數, 設設 x存入存入r0, y存入存入r1, 求解求解: 011y000 xxx西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四圖圖 4.2 西安
21、理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四程序如下程序如下: start: cjne r0, 00h, sul1 ; r0中的數與中的數與00比較不等轉移比較不等轉移 mov r1, 00h ; 相等相等, r1 0 sjmp sul2 sul1: jc neg ; 兩數不等兩數不等, 若(若(r0)0, 則則 r101h sjmp sul2 neg: mov r1, 0ffh ;(r0)0, 則則 r10ffh sul2: ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四
22、 例例 4 比較兩個無符號數的大小。比較兩個無符號數的大小。 設外部設外部 ram 的存儲單元的存儲單元 st1(2000h)和)和 st2(2100h)中存放兩個不帶符號的二進制數)中存放兩個不帶符號的二進制數, 找找出其中的大數存入外部出其中的大數存入外部 ram 中的中的 st3(2200h)單元中。單元中。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四程序如下:程序如下: org 1000h st1 equ 2000h st
23、2 equ 2100h st3 equ 2200h start: mov dptr, st1 ; 第一個數的指針第一個數的指針 movx a, dptr ; 取第一個數取第一個數 mov r2, a ; 保存保存 mov dptr, st2 ; 第二個數的指針第二個數的指針 movx a, dptr ; 取第二個數取第二個數 clr c 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四subb a, r2; 兩數比較兩數比較jnc big1 ; 若第二個數大若第二個數大, 則轉則轉xch a, r2; 第一個數大第一個數大big0: mo
24、v dptr, st3 movx dptr, a ; 存大數存大數retbig1: movx a, dptr; 第二個數大第二個數大sjmp big0西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2.3 循環(huán)程序設計循環(huán)程序設計 一、一、 循環(huán)程序循環(huán)程序 圖圖 4.4 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 循環(huán)程序一般由四個主要部分組成循環(huán)程序一般由四個主要部分組成: (1) 初始化部分初始化部分: 為循環(huán)程序做準備為循環(huán)程序做準備, 如規(guī)定循環(huán)次數、如規(guī)定循環(huán)次
25、數、 給給各變量和地址指針預置初值。各變量和地址指針預置初值。 (2) 處理部分處理部分: 為反復執(zhí)行的程序段為反復執(zhí)行的程序段, 是循環(huán)程序的實體是循環(huán)程序的實體, 也也是循環(huán)程序的主體。是循環(huán)程序的主體。 (3) 循環(huán)控制部分循環(huán)控制部分: 這部分的作用是修改循環(huán)變量和控制變這部分的作用是修改循環(huán)變量和控制變量量, 并判斷循環(huán)是否結束并判斷循環(huán)是否結束, 直到符合結束條件時直到符合結束條件時, 跳出循環(huán)為止。跳出循環(huán)為止。 (4) 結束部分結束部分: 這部分主要是對循環(huán)程序的結果進行分析、這部分主要是對循環(huán)程序的結果進行分析、 處理和存放。處理和存放。 西安理工大學課堂教學講稿西安理工大學
26、課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 5 工作單元清零。工作單元清零。 在應用系統(tǒng)程序設計時在應用系統(tǒng)程序設計時, 有時經常需要將存儲器中部分有時經常需要將存儲器中部分地址單元作為工作單元地址單元作為工作單元, 存放程序執(zhí)行的中間值或執(zhí)行結果存放程序執(zhí)行的中間值或執(zhí)行結果, 工作單元清零工作常常放在程序的初始化部分中。工作單元清零工作常常放在程序的初始化部分中。 設有設有50個工作單元個工作單元, 其首址為外部存儲器其首址為外部存儲器8000h單元單元, 則則其工作單元清零程序如下其工作單元清零程序如下: 西安理工大學課堂教學講稿西安理工大學課堂教學講稿
27、匯編程序設計匯編程序設計 2021年10月21日星期四 clear: clr a mov dptr, 8000h ; 工作單元首址送指針工作單元首址送指針 mov r2, 50 ; 置循環(huán)次數置循環(huán)次數clear1: movx dptr, a inc dptr ; 修改指針修改指針 djnz r2, clear1 ; 控制循環(huán)控制循環(huán) ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例6:設在內部:設在內部 ram的的block單元開始處有長度為單元開始處有長度為 len個的無符號數據塊個的無符號數據塊, 試編一個求和程序試編
28、一個求和程序, 并將和存入內并將和存入內部部 ram的的 sum單元(單元(設和不超過設和不超過 8 位位)。)。 block equ 20h len equ 30h sum equ 40hstart: clr a ; 清累加器清累加器a mov r2, len ; 數據塊長度送數據塊長度送r2 mov r1, block ; 數據塊首址送數據塊首址送r1 loop: add a, r1 ; 循環(huán)加法循環(huán)加法 inc r1 ; 修改地址指針修改地址指針 djnz r2, loop ; 修改計數器并判斷修改計數器并判斷 mov sum, a ; 存和存和 ret 西安理工大學課堂教學講稿西安理工
29、大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 二、二、 多重循環(huán)多重循環(huán) 例例 7 10 秒延時程序。秒延時程序。 延時程序與延時程序與 mcs - 51 執(zhí)行指令的時間有關執(zhí)行指令的時間有關, 如果使用如果使用 12mhz晶振晶振, 一個機器周期為一個機器周期為 1s, 計算出一條指令以至一個計算出一條指令以至一個循環(huán)所需要的執(zhí)行時間循環(huán)所需要的執(zhí)行時間, 給出相應的循環(huán)次數給出相應的循環(huán)次數, 便能達到延時便能達到延時的目的。的目的。10 秒延時程序如下秒延時程序如下: delay: mov r5, 100 del0: mov r6, 200 del1: mov
30、 r7, 248 ;1 del2: djnz r7, del2;2 djnz r6, del1 ;2 djnz r5, del0 ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 上例程序中采用了多重循環(huán)程序上例程序中采用了多重循環(huán)程序, 即在一個循環(huán)體中又包含即在一個循環(huán)體中又包含了其它的循環(huán)程序了其它的循環(huán)程序, 這種方式是實現延時程序的常用方法。這種方式是實現延時程序的常用方法。 使用使用多重循環(huán)時多重循環(huán)時, 必須注意必須注意: (1) 循環(huán)嵌套循環(huán)嵌套, 必須層次分明必須層次分明, 不允許產生內外層循環(huán)交叉。不允許產生內
31、外層循環(huán)交叉。 (2) 外循環(huán)可以一層層向內循環(huán)進入外循環(huán)可以一層層向內循環(huán)進入, 結束時由里往外一層結束時由里往外一層層退出。層退出。 (3) 內循環(huán)可以直接轉入外循環(huán)內循環(huán)可以直接轉入外循環(huán), 實現一個循環(huán)由多個條件實現一個循環(huán)由多個條件控制的循環(huán)結構方式??刂频难h(huán)結構方式。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 8 在外部在外部 ram中中, block開始的單開始的單元中有一無符號數據塊元中有一無符號數據塊, 其個數為其個數為len個字個字節(jié)。試將這些無符號數按遞減次序重新排列節(jié)。試將這些無符號數按遞減次序重新
32、排列, 并存入原存儲區(qū)。并存入原存儲區(qū)。(假設數據塊的高八位地址假設數據塊的高八位地址相同相同) 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四圖圖 4.5西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 org 1000h start: mov dptr, block; 置地址指針置地址指針 mov p2, dph ; p2作地址指針高字節(jié)作地址指針高字節(jié) mov r7, len ; 置外循環(huán)計數初值置外循環(huán)計數初值 dec r7 ; 比較與交換比較與交換 n-1次次loop0:
33、 clr f0 ; 交換標志清交換標志清 0 mov r0, dpl; mov r1, dpl ; 置相鄰兩數地址指針低字節(jié)置相鄰兩數地址指針低字節(jié) inc r1 mov r6, r7 ; 置內循環(huán)計數器初值置內循環(huán)計數器初值 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 loop1: movx a, r0 ; 取數取數 mov b, a ; 暫存暫存 movx a, r1 ; 取下一個數取下一個數 cjne a, b, next; 相鄰兩數比較相鄰兩數比較, 不等轉不等轉 sjmp nocha ; 相等不交換相等不交換 next:
34、jc nocha; cy =1, 則前者大于后者則前者大于后者, 不必交換不必交換 setb f0 ; 否則否則, 置交換標志置交換標志 movx r0, a ; xch a, b ; 兩數交換兩數交換, 大者在前大者在前, 小者在后小者在后 movx r1, a ;西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四nocha: inc r0 inc r1; 修改指針修改指針 djnz r6, loop1 ; 內循環(huán)未完內循環(huán)未完, 則繼續(xù)則繼續(xù) jnb f0, exit ; 若從未交換若從未交換, 則結束則結束 djnz r7, loop
35、0; 外循環(huán)未完外循環(huán)未完, 則繼續(xù)則繼續(xù) exit: ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 9 設某系統(tǒng)的模數轉換器是設某系統(tǒng)的模數轉換器是adc0809, 它的轉換結束它的轉換結束信號信號 eoc連接到連接到8031 的的p1.7端端, 當當eoc的狀態(tài)由低變高時的狀態(tài)由低變高時, 則結束循環(huán)等待則結束循環(huán)等待, 并讀取轉換值并讀取轉換值, 其程序如下其程序如下: start: mov dptr, addr; 0809端口地址送端口地址送dptr mov a, 00h ; 啟動啟動0809轉換轉換 movx
36、dptr, a loop: jnb p1.7, loop; 檢測檢測p1.7狀態(tài)狀態(tài), 判是否轉換結束判是否轉換結束 movx a, dptr; 讀取轉換結果讀取轉換結果西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例10 在內部在內部 ram中從中從50h單元開始的連續(xù)單元依次存單元開始的連續(xù)單元依次存放了一串字符放了一串字符, 該字符串以回車符為結束標志該字符串以回車符為結束標志, 要求測試該字要求測試該字符串的長度。符串的長度。 程序如下程序如下: start: mov r2, 0ffh mov r0, 4fh ; 數據指針數
37、據指針r0置初值置初值 loop: inc r0 inc r2 cjne r0, 0dh, loop ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2.4 散轉程序設計散轉程序設計 散轉程序是分支程序的一種散轉程序是分支程序的一種, 它可根據運算結果或輸它可根據運算結果或輸入數據將程序轉入不同的分支。入數據將程序轉入不同的分支。mcs - 51 指令系統(tǒng)中有指令系統(tǒng)中有一條跳轉指令一條跳轉指令jmpa+dptr, 用它可以很容易地實現散用它可以很容易地實現散轉功能。該指令把累加器的轉功能。該指令把累加器的 8 位無符號數與位
38、無符號數與 16 位數據指位數據指針的內容相加針的內容相加, 并把相加的結果裝入程序計數器并把相加的結果裝入程序計數器pc, 控制控制程序轉向目標地址去執(zhí)行。此指令的程序轉向目標地址去執(zhí)行。此指令的特點特點在于在于, 轉移的目轉移的目標地址不是在編程或匯編時預先確定的標地址不是在編程或匯編時預先確定的, 而是在程序運行而是在程序運行過程中動態(tài)地確定的過程中動態(tài)地確定的。目標地址是以數據指針。目標地址是以數據指針 dptr的內的內容為起始的容為起始的 256 字節(jié)范圍內的指定地址字節(jié)范圍內的指定地址, 即由即由 dptr的內的內容決定分支轉移程序的首地址容決定分支轉移程序的首地址, 由累加器由累
39、加器a的內容來動態(tài)的內容來動態(tài) 選擇其中的某一個分支轉移程序。選擇其中的某一個分支轉移程序。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 11 根據工作寄存器根據工作寄存器r0 內容的不同內容的不同, 使程序轉入相使程序轉入相應的分支。應的分支。 (r0)=0 對應的分支程序標號為對應的分支程序標號為pr0; (r0)=1 對應的分支程序標號為對應的分支程序標號為pr1; (r0)=n 對應的分支程序標號為對應的分支程序標號為prn。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月
40、21日星期四程序如下程序如下: lp0: mov dptr, tab ; 取表頭地址取表頭地址 mov a, r0 add a, r0 ; r0內容乘以內容乘以2 jnc lp1 ; 無進位轉移無進位轉移 inc dph ; 加進位位加進位位lp1: jmp a+dptr; 跳至散轉表中相應位置跳至散轉表中相應位置 tab: ajmp pr0 ajmp pr1 ajmp prn 這一句不要這一句不要行不行?行不行?西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 本例程序僅適用于散轉表首地址本例程序僅適用于散轉表首地址tab和處理程序入口
41、地和處理程序入口地址址 pr0, pr1, , prn在同一個在同一個 2 kb范圍的存儲區(qū)內的情形。范圍的存儲區(qū)內的情形。若超出若超出2kb范圍可在分支程序入口處安排一條長跳轉指令范圍可在分支程序入口處安排一條長跳轉指令, 可采用如下程序可采用如下程序: mov dptr, tabmov a, r0 mov b, 03h ; 長跳轉指令占長跳轉指令占 3 個字節(jié)個字節(jié)mul abxch a, b 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 add a, dph mov dph, a xch a, b jmp a+dptr; 跳至散
42、轉表中相應的位置跳至散轉表中相應的位置 tab: ljmp pr0; 跳至不同的分支跳至不同的分支 ljmp pr1 ljmp prn 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2.5 子程序和參數傳遞子程序和參數傳遞 一、一、 子程序的概念子程序的概念 通常把具有某種操作功能的程序段作為獨立的子程序通常把具有某種操作功能的程序段作為獨立的子程序, 以供不同程序或同一程序反復調用。在程序中需要執(zhí)行這種以供不同程序或同一程序反復調用。在程序中需要執(zhí)行這種操作的地方放置一條調用指令操作的地方放置一條調用指令, 當程序執(zhí)行到調用指令當
43、程序執(zhí)行到調用指令, 就轉就轉到子程序中完成規(guī)定的操作到子程序中完成規(guī)定的操作, 并返回到原來的程序繼續(xù)執(zhí)行下并返回到原來的程序繼續(xù)執(zhí)行下去。去。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 二、二、 子程序的調用子程序的調用 調用子程序的指令有調用子程序的指令有“acall”和和“l(fā)call”, 執(zhí)行調執(zhí)行調用指令時用指令時, 先將程序地址指針先將程序地址指針pc改變(改變(“acall”加加2, “l(fā)call”加加 3), 然后然后 pc值壓入堆棧值壓入堆棧, 用新的地址值代替。用新的地址值代替。執(zhí)行返回指令時執(zhí)行返回指令時,
44、再將再將 pc值彈出。值彈出。 子程序調用中子程序調用中, 主程序應先把有關的參數存入約定的位置主程序應先把有關的參數存入約定的位置, 子程序在執(zhí)行時子程序在執(zhí)行時, 可以從約定的位置取得參數可以從約定的位置取得參數, 當子程序執(zhí)行當子程序執(zhí)行完完, 將得到的結果再存入約定的位置將得到的結果再存入約定的位置, 返回主程序后返回主程序后, 主程序可主程序可以從這些約定的位置上取得需要的結果以從這些約定的位置上取得需要的結果, 這就是參數的傳遞。這就是參數的傳遞。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例12 把內部把內部ram
45、某一單元中一個字節(jié)的十六進制數轉某一單元中一個字節(jié)的十六進制數轉換成兩位換成兩位ascii碼碼, 結果存放在內部結果存放在內部ram的連續(xù)兩個單元中。的連續(xù)兩個單元中。 假設一個字節(jié)的十六進制數在內部假設一個字節(jié)的十六進制數在內部ram40h單元單元, 而結果而結果存入存入50h, 51h單元單元, 可以用堆棧進行參數傳遞可以用堆棧進行參數傳遞, 程序如下程序如下: main: mov r1, 50h ; r1 為存結果的指針為存結果的指針 mov a, 40h ; a為需轉換的十六進制數為需轉換的十六進制數 swap a ; 先轉換高位半字先轉換高位半字 push acc ; 壓棧壓棧 lc
46、all heasc ; 調用將低半字節(jié)的內容轉換調用將低半字節(jié)的內容轉換; 成成ascii碼子程序碼子程序heasc pop acc mov r1, a ; 存高半字節(jié)轉換結果存高半字節(jié)轉換結果 inc r1 push 40h 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 lcall heasc pop acc mov r1, a ; 存低半字節(jié)轉換結果存低半字節(jié)轉換結果 endheasc: mov r0, sp dec r0 dec r0 ; r0 指向十六進制數參數地址指向十六進制數參數地址 xch a, r0 ; 取被轉換參數取
47、被轉換參數 anl a, 0fh ; 保留低半字節(jié)保留低半字節(jié) add a, 2 ; 修改修改a值值 movc a, a+pc ; 查表查表 xch a, r0; 結果送回堆棧結果送回堆棧 ret tab: db 30h, 31h, 32h, 為什么r0連續(xù)2次減1?轉換結果是如何傳遞的?轉換結果是如何傳遞的? 為什么要加2西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2.6 查表程序設計查表程序設計 查表程序是一種常用程序查表程序是一種常用程序, 它廣泛使用于它廣泛使用于 led顯示控制、顯示控制、打印機打印控制、數據補償、數值計
48、算、轉換等功能程序中打印機打印控制、數據補償、數值計算、轉換等功能程序中, 這類程序具有簡單、執(zhí)行速度快等特點。這類程序具有簡單、執(zhí)行速度快等特點。 所謂查表法所謂查表法, 就是預先將滿足一定精度要求的表示變量與就是預先將滿足一定精度要求的表示變量與函數值之間關系的一張表求出函數值之間關系的一張表求出, 然后把這張表存于單片機的程然后把這張表存于單片機的程序存儲器中序存儲器中, 這時自變量值為單元地址這時自變量值為單元地址, 相應的函數值為該地相應的函數值為該地址單元中的內容。查表址單元中的內容。查表, 就是根據變量就是根據變量x在表格中查找對應的在表格中查找對應的函數值函數值 y, 使使 y
49、=f(x)。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四mcs - 51指令系統(tǒng)中指令系統(tǒng)中, 有兩條查表指令有兩條查表指令: movc a, a+pc movc a, a+dptr 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 13 一個十六進制數存放在內部一個十六進制數存放在內部 ram 的的hex單元的單元的低低 4 位中位中, 將其轉換成將其轉換成ascii碼并送回碼并送回 hex單元。單元。 十六進制十六進制 09的的ascii碼為碼為30h39h, af的
50、的ascii碼碼為為41h46h, ascii碼表格的首地址為碼表格的首地址為asctab。編程如下。編程如下: org 1000h hexasc: mov a, hex anl a, 0fh add a, 3; 修改指針修改指針 movc a, a+pc mov hex, a ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四asctab: db 30h, 31h, 32h, 33h, 34h db 35h, 36h, 37h, 38h, 39h db 41h, 42h, 43h, 44h, 45h db 46h 在這個程序中在這
51、個程序中, 查表指令查表指令movc a, a+pc到表格首到表格首地址有兩條指令地址有兩條指令, 占用占用 3 個字節(jié)地址空間個字節(jié)地址空間, 故修改指針應加故修改指針應加 3。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 14 設有一個巡回檢測報警裝置設有一個巡回檢測報警裝置, 需對需對 96 路輸入進行路輸入進行控制控制, 每路有一個額定的最大值每路有一個額定的最大值, 是雙字節(jié)數。當檢測量大于是雙字節(jié)數。當檢測量大于該路對應的最大值時該路對應的最大值時, 就越限報警。假設就越限報警。假設r2 為保存檢測路數為保存檢測路
52、數的寄存器的寄存器, 其對應的最大額定值存放于其對應的最大額定值存放于 31h和和 32h單元中。單元中。 查找最大額定值的程序如下查找最大額定值的程序如下: fmax: mov a, r2 add a, r2 ; 表中一個額定值為表中一個額定值為2個字節(jié)個字節(jié) mov 31h, a mov dptr, tab ; 表首址表首址 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四movc a, a+dptr; 查表讀取第一個字節(jié)查表讀取第一個字節(jié) xch a, 31h ; 第一個字節(jié)內容存入第一個字節(jié)內容存入31h inc dptr mov
53、c a, a+dptr; 查表讀取第二個字節(jié)查表讀取第二個字節(jié) mov 32h, a ; 第二字節(jié)的內容存入第二字節(jié)的內容存入32h tab: dw 1230h, 1450h, . dw 2230h, 2440h, . dw 3120h, 3300h, . 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 15 在一個溫度檢測系統(tǒng)中在一個溫度檢測系統(tǒng)中, 溫度模擬信號由溫度模擬信號由 10 位位a/d輸入。將輸入。將a/d結果轉換為對應溫度值結果轉換為對應溫度值, 可采用查表方法實現。可采用查表方法實現。 先由實驗測試出整個溫度量程
54、范圍內的先由實驗測試出整個溫度量程范圍內的a/d轉換結果轉換結果, 把把a/d轉換結果轉換結果000h3ffh所對應的溫度值組織為一個表存儲在所對應的溫度值組織為一個表存儲在程序存儲器中程序存儲器中, 那么就可以根據檢測到的模擬量的那么就可以根據檢測到的模擬量的 a/d轉換轉換值查找出相應的溫度值。值查找出相應的溫度值。 設測得的設測得的a/d轉換結果已存入轉換結果已存入 20h, 21h單元中(高位字單元中(高位字節(jié)在節(jié)在20h中中, 低位字節(jié)在低位字節(jié)在21h中)中), 查表得到的溫度值存放在查表得到的溫度值存放在22h,23h單元(高位字節(jié)在單元(高位字節(jié)在 22h中中, 低位字節(jié)在低位
55、字節(jié)在23h中)。中)。 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四程序如下程序如下: ftmp: mov dptr, tab ; dptr表首地址表首地址 mov a, 21h ; (20h)()(21h)2clr crlc amov 21h, amov a, 20hrlc amov 20h, amov a, 21h ; 表首地址表首地址+偏移量偏移量 addc a, dplmov dpl, a西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四mov a, 20haddc a,
56、 dphmov dph, aclr amovc a, a+dptr; 查表得溫度值高位字節(jié)查表得溫度值高位字節(jié)mov 22h, aclr ainc dptrmovc a, a+dptr; 查表得溫度值低位字節(jié)查表得溫度值低位字節(jié)mov 23h, arettab: dw 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2.7 數制轉換數制轉換 例例 16 將一個字節(jié)二進制數轉換成將一個字節(jié)二進制數轉換成 3 位非壓縮型位非壓縮型bcd碼。碼。 設一個字節(jié)二進制數在內部設一個字節(jié)二進制數在內部ram 40h單元單元, 轉換結果放入內轉換結
57、果放入內部部 ram 50h, 51h, 52h單元中(高位在前)單元中(高位在前), 程序如下程序如下: hexbcd: mov a, 40h mov b, 100 div ab mov 50h, a mov a, 10 xch a, b div ab mov 51h, a mov 52h, b ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 例例 17 設設 4 位位bcd碼依次存放在內存碼依次存放在內存 ram中中 40h43h單元的低單元的低4 位位, 高高 4 位都為位都為 0, 要求將其轉換為二進制數要求將其轉換為二
58、進制數, 結果結果存入存入 r2r3 中。中。 一個十進制數可表示為一個十進制數可表示為: dn10n +dn-110n-1 + + d0100 =(dn10+dn-1)10+dn-2)10+)+d0 當當n=3時時, 上式可表示為上式可表示為: (d310+d2)10+d1)10+d0 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四bcdhex: mov r0, 40h ; r0指向最高位地址指向最高位地址 mov r1, 03 ; 計數值送計數值送r1 mov r2, 0 ; 存放結果的高位清零存放結果的高位清零 mov a, r0
59、 mov r3, a loop: mov a, r3 mov b, 10 mul ab mov r3, a ; (r3)10 的低的低 8 位送位送r3 mov a, b xch a, r2 ; (r3)10的高的高 8 位暫存位暫存r2 mov b, 10 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四 mul ab add a, r2 mov r2, a ; r210+( r310)高)高 8 位送位送r2 inc r0 ; 取下一個取下一個 bcd數數 mov a, r3 add a, r0 mov r3, a mov a, r2
60、 addc a, 0 ; 加低字節(jié)來的進位加低字節(jié)來的進位 mov r2, a djnz r1, loop ret 西安理工大學課堂教學講稿西安理工大學課堂教學講稿 匯編程序設計匯編程序設計 2021年10月21日星期四4.2.8 運算程序運算程序 一、一、 加、加、 減法程序減法程序 例例 18 將將40h開始存放的開始存放的 10 個字節(jié)的數與個字節(jié)的數與 50h開始存放的開始存放的10 個字節(jié)的數相減(假設被減數大于減數)。個字節(jié)的數相減(假設被減數大于減數)。 設被減數指針為設被減數指針為 r0, 減數指針為減數指針為 r1, 差數放回被減數單元差數放回被減數單元, r5 存放字節(jié)個數
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國陸上貨物運輸保險市場運行狀況及發(fā)展風險評估報告
- 2025-2030年中國鏈鋸條行業(yè)前景調查及未來風險評估報告
- 2025-2030年中國透氣透濕涂層行業(yè)運行現狀及發(fā)展前景預測報告
- 2025-2030年中國螺旋傘齒輪行業(yè)發(fā)展現狀及前景趨勢分析報告
- 2025-2030年中國膳食纖維市場發(fā)展趨勢及投資戰(zhàn)略研究報告
- 2025-2030年中國粘玉米行業(yè)規(guī)模分析及發(fā)展建議研究報告
- 2025-2030年中國男士香水行業(yè)運行態(tài)勢及發(fā)展前景分析報告
- IT系統(tǒng)軟件開發(fā)與維護委托合同
- 三位數乘以一位數能力作業(yè)訓練題
- 初中生心理健康教育講座課件
- 2024年司法考試完整真題及答案
- 部編高教版2023·職業(yè)模塊 中職語文 《寧夏閩寧鎮(zhèn):昔日干沙灘今日金沙灘》課件
- 企業(yè)對外溝通與形象塑造制度
- 《前列腺增生》課件
- 整體法蘭強度校核計算表(設計:zxg)
- 供應鏈經理年度工作計劃
- 2024年甘肅省公務員錄用考試《行測》真題卷及答案解析
- 2024年執(zhí)業(yè)藥師繼續(xù)教育專業(yè)答案
- 中國高血壓防治指南(2024年修訂版)要點解讀
- 非ST段抬高型急性冠脈綜合征診斷和治療指南(2024)解讀
評論
0/150
提交評論