日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月04日(星期五)

2020年07月04日 | 用51匯編完整寫一個函數(shù)

發(fā)布者:創(chuàng)意小巨人 來源: eefocus關(guān)鍵字:51匯編  函數(shù)  CRC 手機看文章 掃描二維碼
隨時隨地手機看文章

本文將以查表法CRC為例,完整介紹如何用匯編寫一個函數(shù),以及如何傳入函數(shù)參數(shù)、獲得返回值、被其他函數(shù)調(diào)用。


最近用匯編寫了一個查表法CRC16校驗函數(shù),其中遇到很多困難,走了很多彎路,特此記錄,請大家共勉。請結(jié)合最后的附錄代碼看前面的解釋,會好理解很多。匯編代碼基本就是按照C代碼一句一句翻譯的。


1.匯編函數(shù)如何傳入?yún)?shù)

需要改寫的C函數(shù)如下:


u16 Crc16withTable(u8 *buf, u16 seeds, u16 len) 

首先想到的就是怎么傳入?yún)?shù),因為匯編不像C語言一樣可以用括號表示形參,那么如何給匯編函數(shù)傳入?yún)?shù)呢?這涉及到不同芯片架構(gòu)的規(guī)定,C51規(guī)定如下:

大家可以在keil4軟件中的Help->uVision Help->搜索中搜索Parameter Passing關(guān)鍵字,就會看到這段信息。翻譯如下:


C51編譯器在CPU寄存器中最多傳遞三個函數(shù)參數(shù)。這顯著提高了系統(tǒng)性能,因為不需要將參數(shù)寫入內(nèi)存并從內(nèi)存中讀取參數(shù)。參數(shù)傳遞可以通過REGPARMS和NOREGPARMS控制指令進(jìn)行控制。下表列出了用于不同參數(shù)和數(shù)據(jù)類型的寄存器。


如果沒有寄存器可用來傳遞參數(shù),或者涉及的參數(shù)太多,則為這些額外的參數(shù)使用固定的內(nèi)存位置。


對上表進(jìn)行解釋:


首先,傳遞的參數(shù)不能超過3個,如果超過3個,需要使用外部ram的固定地址存放。

其次,從表中可以看出,傳遞的參數(shù)類型不同,允許傳遞的參數(shù)個數(shù)也將發(fā)生變化。

最后,不同參數(shù)類型對應(yīng)的寄存器不同。

以本文的函數(shù)為例,傳入的參數(shù)有3個,分別是指向u8的指針buf、2byte大小的seeds、2byte大小的len。

第1個參數(shù)對應(yīng)表的第1行,buf是一個指針,在51中地址是16位,所以buf本質(zhì)上是2byte 指針,所以寄存器R6和R7分別存放buf的高字節(jié)和低字節(jié),可以參考匯編代碼第60行和第63行,直接調(diào)用R6和R7就是調(diào)用buf的高字節(jié)和低字節(jié);

第2個參數(shù)對應(yīng)表的第2行,seed也是2byte,所以它占用R4和R5兩個寄存器;

第3個參數(shù)對應(yīng)表的第3行,len也是2byte,所以它占用R2和R3兩個寄存器。

當(dāng)你在調(diào)用這個函數(shù)時,給函數(shù)傳入實參,然后程序就會跳轉(zhuǎn)到匯編代碼一行一行執(zhí)行,這時候你傳入的實參就已經(jīng)在寄存器中了,至于各寄存器里面放哪個參數(shù)的值,上一段已經(jīng)講的很清楚了。


2.匯編函數(shù)如何返回結(jié)果

有的函數(shù)執(zhí)行完后需要返回結(jié)果,這個結(jié)果可能是1byte,也可能是2byte,也可能是4byte。但是匯編不像C語言函數(shù)直接用return就可以,與第1章所述一樣,匯編函數(shù)的返回值也是放在寄存器中的。如本文匯編函數(shù)最后4行,是將計算結(jié)果放在了R6和R7兩個寄存器中。那么在執(zhí)行完函數(shù)返回到C語言中時,芯片自動將R6和R7中的值取出,作為返回值返回。


這里只是知道2byte返回值放在R6和R7寄存器中,但是不知道1byte和4byte時應(yīng)該放在哪個寄存器,也沒有找到資料。大家實際用的時候可以試一下,看放在哪個寄存器里可以返回正確值。


3.匯編函數(shù)如何在C語言中被調(diào)用

我自己的方法是:


將需要用匯編寫的函數(shù)單獨新建一個.asm文件,然后在這個里面寫匯編函數(shù);

寫匯編函數(shù)時需要特別注意:如果有參數(shù),需要在函數(shù)名前加“_”,表示這個函數(shù)時帶參數(shù)的,參考本文匯編代碼第1行;

匯編函數(shù)最后一定加“END”,參考本文匯編代碼最后1行;

在調(diào)用這個函數(shù)的地方,先用“extern”聲明一下這個函數(shù),聲明就能直接用C語言函數(shù)的格式就行,如下:

extern u16 Crc16withTable(u8 *buf, u16 seeds, u16 len); 

最后將這個.asm文件添加到工程即可。

 

附錄A:查表法crc校驗C代碼:

/*****************************************************************************

*function name:Crc16withTable

*function: 用查表法計算CRC

*input:  addr:字符串起始地址;len :字符串長度;crcHighTable,crcLowTable:用到的表格

*output:無

******************************************************************************/

u16 Crc16withTable(u8 *buf, u16 seeds, u16 len)  

{  

    u8 crcHi = 0x00;

    u8 crcLo = 0x00;

    u8 index;

    u16 crc;

    u16 i;

    for (i=0;i    {  

        index = crcLo ^ *(buf+i+1);//低8位異或,得到表格索引值

        crcLo = crcHi ^ crcHighTable[index];

        crcHi = crcLowTable[index];

 

        index = crcLo ^ *(buf+i);//低8位異或,得到表格索引值

        crcLo = crcHi ^ crcHighTable[index];

        crcHi = crcLowTable[index]; 

    }

    crc = (u16)(crcHi<<8 | crcLo);

    return crc;

}

 


附錄B:查表法crc校驗匯編代碼:

PUBLIC _Crc16withTable ;函數(shù)名前加"_",表示此函數(shù)帶參數(shù)

;u16 Crc16withTable(u8 *buf, u16 seeds, u16 len)

?PR?__Crc16withTable SEGMENT CODE

RSEG ?PR?_Crc16withTable

CRC16HighTable: DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H, 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H

DB 00H,0c1H, 81H, 40H, 01H,0c0H, 80H, 41H, 01H,0c0H, 80H, 41H, 00H,0c1H, 81H, 40H

CRC16LowTable: DB 00H,  0c0H,0c1H, 01H,0c3H, 03H, 02H,0c2H,0c6H, 06H, 07H,0c7H, 05H,0c5H,0c4H, 04H

DB 0ccH, 0cH, 0dH,0cdH, 0fH,0cfH,0ceH, 0eH, 0aH,0caH,0cbH, 0bH,0c9H, 09H, 08H,0c8H

DB 0d8H, 18H, 19H,0d9H, 1bH,0dbH,0daH, 1aH, 1eH,0deH,0dfH, 1fH,0ddH, 1dH, 1cH,0dcH

DB 14H,  0d4H,0d5H, 15H,0d7H, 17H, 16H,0d6H,0d2H, 12H, 13H,0d3H, 11H,0d1H,0d0H, 10H

DB 0f0H, 30H, 31H,0f1H, 33H,0f3H,0f2H, 32H, 36H,0f6H,0f7H, 37H,0f5H, 35H, 34H,0f4H

DB 3cH,  0fcH,0fdH, 3dH,0ffH, 3fH, 3eH,0feH,0faH, 3aH, 3bH,0fbH, 39H,0f9H,0f8H, 38H

DB 28H,  0e8H,0e9H, 29H,0ebH, 2bH, 2aH,0eaH,0eeH, 2eH, 2fH,0efH, 2dH,0edH,0ecH, 2cH

DB 0e4H, 24H, 25H,0e5H, 27H,0e7H,0e6H, 26H, 22H,0e2H,0e3H, 23H,0e1H, 21H, 20H,0e0H

DB 0a0H, 60H, 61H,0a1H, 63H,0a3H,0a2H, 62H, 66H,0a6H,0a7H, 67H,0a5H, 65H, 64H,0a4H

DB 6cH,  0acH,0adH, 6dH,0afH, 6fH, 6eH,0aeH,0aaH, 6aH, 6bH,0abH, 69H,0a9H,0a8H, 68H

DB 78H,  0b8H,0b9H, 79H,0bbH, 7bH, 7aH,0baH,0beH, 7eH, 7fH,0bfH, 7dH,0bdH,0bcH, 7cH

DB 0b4H, 74H, 75H,0b5H, 77H,0b7H,0b6H, 76H, 72H,0b2H,0b3H, 73H,0b1H, 71H, 70H,0b0H

DB 50H,  90H, 91H, 51H, 93H, 53H, 52H, 92H, 96H, 56H, 57H, 97H, 55H, 95H, 94H, 54H

DB 9cH,  5cH, 5dH, 9dH, 5fH, 9fH, 9eH, 5eH, 5aH, 9aH, 9bH, 5bH, 99H, 59H, 58H, 98H

DB 88H,  48H, 49H, 89H, 4bH, 8bH, 8aH, 4aH, 4eH, 8eH, 8fH, 4fH, 8dH, 4dH, 4cH, 8cH

DB 44H,  84H, 85H, 45H, 87H, 47H, 46H, 86H, 82H, 42H, 43H, 83H, 41H, 81H, 80H, 40H

_Crc16withTable:

;R6放addr高字節(jié)

;R7放addr低字節(jié)

;R4放seeds高字節(jié),即crcHi

;R5放seeds低字節(jié),即crcLo

;R2放len高字節(jié)

;R3放len低字節(jié)

 

MOV     R0,#0x00 ;R0放i高字節(jié)

MOV     R1,#0x00 ;R1放i低字節(jié)

BEGINLOOP:

CRL     C ;清除結(jié)借位(進(jìn)位)標(biāo)志位

MOV     A,R1

SUBB    A,R3

MOV     A,R0

SUBB    A,R2

JNC     ENDLOOP

;index=crcLo^*(buf+i+1)

MOV A,R7 ;buf低字節(jié)->A

ADD A,R1 ;buf低字節(jié)+i低字節(jié)

MOV DPL,A ;低字節(jié)之和->PDL

MOV A,R6 ;buf高字節(jié)->A

ADDC A,R0 ;buf高字節(jié)+i高字節(jié)

MOV DPH,A ;高字節(jié)之和->DPH

MOV A,#0x01

MOVC A,@A+DPTR ;*(buf+i+1)

XRL A,R5 ;A=index=*(buf+i+1)^crcLo

MOV B,A ;B=index

;crcLo=crcHi^CRCHighTable[index]

MOV DPTR,#CRC16HighTable;獲取表的首地址

MOVC A,@A+DPTR ;CRCHighTable[index]

XRL A,R4 ;CRCHighTable[index]^crcHi

MOV R5,A ;crcLo=A,更新crcLo的值

;crcHi=CRC16LowTable[index]

MOV A,B ;index->A

MOV DPTR,#CRC16LowTable ;獲取表的首地址

MOVC A,@A+DPTR ;A=CRC16LowTable[index]

MOV R4,A ;crcHi=A,更新crcHi的值

;第2次循環(huán)

;index=crcLo^*(buf+i)

MOV A,R7 ;buf低字節(jié)->A

CLR C

ADD A,R1 ;buf低字節(jié)+i低字節(jié)

MOV DPL,A ;低字節(jié)之和->PDL

MOV A,R6 ;buf高字節(jié)->A

ADDC A,R0 ;buf高字節(jié)+i高字節(jié)

MOV DPH,A ;高字節(jié)之和->DPH

CLR A

MOVC A,@A+DPTR ;*(buf+i)

XRL A,R5 ;A=index=*(buf+i)^crcLo

MOV B,A ;B=index

;crcLo=crcHi^CRCHighTable[index]

MOV DPTR,#CRC16HighTable;獲取表的首地址

MOVC A,@A+DPTR ;CRCHighTable[index]

XRL A,R4 ;CRCHighTable[index]^crcHi

MOV R5,A ;crcLo=A,更新crcLo的值

;crcHi=CRC16LowTable[index]

MOV A,B ;index->A

MOV DPTR,#CRC16LowTable ;獲取表的首地址

MOVC A,@A+DPTR ;A=CRC16LowTable[index]

MOV R4,A ;crcHi=A,更新crcHi的值

;i=i+2

MOV A,#0x02

CLR C

ADD A,R1

MOV R1,A ;更新i低字節(jié)

CLR A

ADDC A,R0 ;

MOV R0,A ;更新i高字節(jié)

LJMP BEGINLOOP ;無條件跳轉(zhuǎn)至循環(huán)開始部分

ENDLOOP:

MOV A,R4 ;

MOV R6,A

MOV A,R5

MOV R7,A

RET

END

關(guān)鍵字:51匯編  函數(shù)  CRC 引用地址:用51匯編完整寫一個函數(shù)

上一篇:51單片機學(xué)習(xí)筆記——基于匯編語言(2)
下一篇:最后一頁

推薦閱讀

本文由微信公眾號“半導(dǎo)體行業(yè)觀察”翻譯自“SIA”。日前,SIA發(fā)布了全球半導(dǎo)體產(chǎn)業(yè)去年發(fā)展的基本情況,并對美國本土半導(dǎo)體的全球影響力做了一個整體分析。在此,我們將其翻譯,呈現(xiàn)到各位讀者眼前,希望大家對世界半導(dǎo)體現(xiàn)狀和美國半導(dǎo)體的真正實力有一個深入的了解。另外。想查看英文原文的,可以回復(fù)“2018Factbook”下載相關(guān)文件。在過去20年里,世界...
6月27日消息,據(jù)媒體報道,三星Galaxy A80即將在中國臺灣上市發(fā)售。官方確認(rèn)將于6月底正式發(fā)售,提供極鏡黑、極鏡黑與極鏡金三種配色,售價19990新臺幣(約合人民幣4400元)。  該機最大的亮點是采用了滑蓋翻轉(zhuǎn)鏡頭設(shè)計,其采用6.7英寸無劉海、無挖孔的真全面屏形態(tài),后置4800萬主攝+800萬超廣角+3D景深鏡頭。  當(dāng)使用者選擇自拍模式時,相...
以前開發(fā)arm裸機程序都是在ADS1.2開發(fā)環(huán)境下編譯和調(diào)試的。剛開始時初學(xué)嵌入式好多東西不懂,選擇這個開發(fā)環(huán)境的理由,一是資料多的,mini2440開發(fā)板上提供了很多例程可以參考,網(wǎng)上幾乎所有arm裸機程序都是基于ADS1.2開發(fā)的。二是開發(fā)環(huán)境友善,雖然后來感覺ADS1.2有點難用,但畢竟是IDE的環(huán)境,對初學(xué)者來說總比命令行的方式更加直觀與方便。隨著學(xué)習(xí)的...
根據(jù)臺積電方面的規(guī)劃,3nm工藝將在今年第三季度開始風(fēng)險試產(chǎn),并于2022年大規(guī)模量產(chǎn)。盡管時間尚早,但據(jù)悉,蘋果和英特爾已成為首批采用其3nm工藝的客戶之一。日經(jīng)亞洲評論援引幾位知情人士的話述,蘋果和英特爾正利用臺積電3nm工藝測試自家的芯片設(shè)計,預(yù)計相關(guān)芯片將于明年下半年開始商業(yè)化生產(chǎn)。根據(jù)臺積電的說法,和5nm制程相比,3nm制程有助于計算...

史海拾趣

問答坊 | AI 解惑

單片機開發(fā)資料

本教程是基于51單片機的開發(fā)!…

查看全部問答∨

學(xué)習(xí)單片機的朋友加群一起學(xué)習(xí)群號24239090

學(xué)習(xí)單片機的朋友請進(jìn)來交流學(xué)習(xí),交流技巧經(jīng)驗,心得交流,讓我們一起學(xué)習(xí)的更猛烈些,有興趣的朋友請加群24239090歡迎大家/…

查看全部問答∨

請教一個關(guān)于嵌入式,硬盤名字的問題 急??!到現(xiàn)在還沒找到解決方法

我想問一下當(dāng)一個可移動設(shè)備插入到系統(tǒng)上時,一般會顯示什么名字? 1、嵌入式系統(tǒng)對可移動硬盤、軟盤、光盤等的命名規(guī)則,各在wince下的顯示名稱 2、在注冊表中的顯示,我查看了一下注冊表,有HDProfile,USBHDProfile,USBCDProfile,USBFDProfile ...…

查看全部問答∨

擴展IO口的問題

各位大俠,本人用arm9芯片發(fā)現(xiàn)IO口不夠用了,想從地址線和數(shù)據(jù)口擴展IO口,應(yīng)該怎么辦?。??請大俠賜教?。。?!…

查看全部問答∨

請問一下像IO0DIR、IO0CLR、IO0Set等寄存器的地址在哪里找???芯片手冊上沒有啊!

請問一下像IO0DIR、IO0CLR、IO0Set等寄存器的地址在哪里找啊?芯片手冊上沒有啊!   別說在芯片手冊上找,我在芯片手冊上未找到 這是我下載的芯片手冊! …

查看全部問答∨

關(guān)于DIY數(shù)控電源外殼及面板背板的一點想法

這次DIY數(shù)控電源,涉及到外殼和內(nèi)部板子及散熱器固定等一些結(jié)構(gòu)設(shè)計的問題。我有一點思路想在這里提一下。 電源外殼和內(nèi)部結(jié)構(gòu)的設(shè)計是服務(wù)于電源電路功能需求的輔助部分。應(yīng)該于電路板及操作件定型后著手設(shè)計。如果電路板與散熱器等部件尺寸實在 ...…

查看全部問答∨

WINCE 60下怎么寫SPI的驅(qū)動?

我初學(xué)啊;感覺WINCE 好學(xué)就學(xué)那;其他的沒基礎(chǔ);IO驅(qū)動簡單流驅(qū)動好寫;但這個SPI驅(qū)動怎么寫呢;比如有的在啟動的時候還沒進(jìn)入WINCE 界面的時候都要用到SPI驅(qū)動呢;請問WINCE在驅(qū)動時與啟動完成后能用的這個WINCE 的SPI驅(qū)動怎么寫的?;…

查看全部問答∨

調(diào)節(jié)三色LED的亮度問題

誰能告訴我如何利用8031單片機調(diào)節(jié)三色LED的亮度?非常感謝!…

查看全部問答∨

學(xué)習(xí)易電源心得

之前學(xué)習(xí)了TI的DC-DC教學(xué),現(xiàn)在再學(xué)習(xí)SIMPLE SWITCHER,覺得收獲比較多。知道了同時帶有片上電感器的 1A LMZ10501和650 mA LMZ10500納米模塊,以及2A LMR24220和1A LMR24210納米穩(wěn)壓器采用高性能和微型納米封裝。 與TI的WEBENCH在線設(shè)計工具一起使 ...…

查看全部問答∨

小白求STM32定時器觸發(fā)多路ADC指導(dǎo)程序,之前找到的都觸發(fā)不了

小白求STM32定時器觸發(fā)多路ADC指導(dǎo)程序,之前找到的都觸發(fā)不了…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved