時(shí)間:2022-10-24 03:41:53
序論:在您撰寫匯編語言時(shí),參考他人的優(yōu)秀作品可以開闊視野,小編為您整理的7篇范文,希望這些建議能夠激發(fā)您的創(chuàng)作熱情,引導(dǎo)您走向新的創(chuàng)作高度。
Abstract: Assembly language is machine language, which is difficult to understand because it is far from natural language. In order to improve the teaching effectiveness of assembly language programming, this article gives the interpreted analysis which is confused and difficult to understand.
關(guān)鍵詞: 指令;偽指令;中斷;尋址方式
Key words: instructions;pseudoinstruction;interrupts;addressing mode
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1006-4311(2014)23-0227-02
1概述
匯編語言不同于其它高級(jí)語言,必須要求編程人員有一定的硬件基礎(chǔ),如對(duì)CPU的結(jié)構(gòu)、CPU與存儲(chǔ)器等部件的數(shù)據(jù)傳送過程必須要有基本的了解,這樣才能學(xué)好這門課程。在教學(xué)過程中,教師發(fā)現(xiàn)學(xué)生對(duì)高級(jí)語言編程學(xué)習(xí)積極性高,對(duì)匯編語言課程缺乏興趣,但因?yàn)檎n程本身指令復(fù)雜,規(guī)定繁多,再加上學(xué)習(xí)匯編指令前對(duì)CPU的相關(guān)工作過程理解不透,導(dǎo)致學(xué)生厭學(xué),又由于本課程面對(duì)的低年級(jí)學(xué)生只有高級(jí)語言的基礎(chǔ),習(xí)慣于高級(jí)語言的自然表達(dá),初次接觸計(jì)算機(jī)硬件知識(shí)心理上有恐懼感,更難以適應(yīng)繁雜的低級(jí)語言。本文用比較的辦法,通俗易懂的自然比喻對(duì)這門課中易混淆的,較難理解的概念予以解釋分析。
2指令性語句與偽指令語句的區(qū)別
例如:ADD AX,10+5經(jīng)過匯編變成ADD AX,15,10+5的運(yùn)算匯編階段完成,AX和15的加法運(yùn)算要等到運(yùn)行階段才能完成,匯編階段能實(shí)現(xiàn)的運(yùn)行階段一定能實(shí)現(xiàn),上述+運(yùn)算可變?yōu)锳DD AX,10;ADD AX,5兩句實(shí)現(xiàn)。運(yùn)行階段能實(shí)現(xiàn)的,匯編階段不一定能實(shí)現(xiàn),如 ADDAX,BX+CX;程序還沒有運(yùn)行,匯編階段不可能知道BX,CX的值,更談不上計(jì)算二者之和。
再如以下用漢語表示的程序,要翻譯成英語,看看偽指令語句如何指導(dǎo)匯編過程:
以下是黑體,2號(hào)字,居中 ;指導(dǎo)匯編
通知 ;翻譯
以下是宋體,3號(hào)字,首行縮進(jìn) ;指導(dǎo)匯編
今天下午開會(huì)…… ;翻譯
以下是楷體,4號(hào)字,右對(duì)齊 ;指導(dǎo)匯編
特此通知 ;翻譯
3宏指令與子程序的區(qū)別
4子程序和中斷服務(wù)程序的區(qū)別
5CALL、INT、硬中斷的區(qū)別
可以看出,INT既有CALL的特點(diǎn)(可預(yù)知),又有硬中斷的特點(diǎn)(中斷類型碼轉(zhuǎn)換成入口地址),介于二者之間,故稱INT指令為軟中斷指令(由軟件指令I(lǐng)NT發(fā)出的中斷)。
6=與EQU的區(qū)別
7LABEL、THIS、PTR的區(qū)別(見表6)
8段地址、段內(nèi)地址、物理地址的關(guān)系解析
為了說明段地址、段內(nèi)地址、物理地址三者之間的關(guān)系,下面舉例說明(表7)。
9SFOF=1表示兩個(gè)有符號(hào)數(shù)是小于關(guān)系解析
溢出,就是放不下,一旦溢出結(jié)果一定是錯(cuò)的。例如兩個(gè)瓶子容量各是5斤,一個(gè)裝了3斤水,一個(gè)裝了4斤水,理論上講,倒在一個(gè)瓶子應(yīng)該是7斤,但全部倒在一個(gè)瓶子后,成了5斤,2斤溢出,不能說3+4=5,所以一旦溢出結(jié)果一定是錯(cuò)的。異號(hào)相加,越加越少,原來放得下,加了之后一定放得下,故絕對(duì)不溢出。同號(hào)相加,越加越多,原來放得下,加了之后不一定放得下,故有可能溢出。若溢出OF=1,正數(shù)加正數(shù)應(yīng)該是正數(shù),應(yīng)該SF=0,但若結(jié)果SF=1,正數(shù)加正數(shù)是負(fù)數(shù),SF=1是錯(cuò)的(假的符號(hào)位)。同樣道理,負(fù)數(shù)加負(fù)數(shù)應(yīng)該是負(fù)數(shù),應(yīng)該SF=1,但若結(jié)果SF=0,負(fù)數(shù)加負(fù)數(shù)是正數(shù),SF=0是錯(cuò)的(假的符號(hào)位)。
10結(jié)束語
總之,匯編語言是計(jì)算機(jī)程序編寫中最經(jīng)常用的一種必要程序語言,投入?yún)R編語言領(lǐng)域更多的研究與開發(fā)關(guān)注也是十分必要和有益的。
參考文獻(xiàn):
[1](美)布魯姆著.編語言程序設(shè)計(jì)[M].馬朝暉,譯.北京:機(jī)械工業(yè)出版社,2006.
關(guān)鍵詞:加密算法DES匯編語言
目前在金融界及非金融界的保密通信中,越來越多地用到了DES算法。DES(DataEncryptionStandard)即數(shù)據(jù)加密算法,是IBM公司于1977年研究成功并公開發(fā)表的。隨著我國三金工程尤其是金卡工程的啟動(dòng),DES算法在POS、ATM、磁卡及智能卡(IC卡)中被廣泛應(yīng)用,以此來實(shí)現(xiàn)關(guān)鍵數(shù)據(jù)的保密。如信用卡持卡人的PIN的加密傳輸、IC卡與POS間的雙向認(rèn)證、金融交易中的密碼鍵盤等,均用到DES算法。由于密碼鍵盤不可能使用高級(jí)語言,所以用匯編語言實(shí)現(xiàn)DES就非常實(shí)用。
1DES算法的簡單原理
DES是一種分組密碼。假定明文m是由0和1組成的長度為64位的符號(hào)串,密鑰k也是64位的0、1符號(hào)串。
設(shè):M=m1m2m3…m64
K=k1k2k3…k64
加密過程可表達(dá)如下:
DES(m)=IP-1·T16·T15…T2·T1·IP(m)
其中:IP(m)是初始置換,IP-1是逆置換,T16~T1是16次迭代。
(1)初始置換IP
功能是把輸入的明文m按位重新組合,并把輸出分為L0、R0兩部分,每部分各長32位,其置換規(guī)則如下:
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7
(2)逆置換IP-1
經(jīng)過16次迭代運(yùn)算后,得到L16、R16,將此作為輸入,進(jìn)行逆置換。逆置換滿足:
IP·IP-1=IP-1·IP=I
逆置換正好是初始置換的逆運(yùn)算。
(3)T16~T1的迭代計(jì)算
DES的迭代算法采用模2加法。
在通信網(wǎng)絡(luò)的兩端,雙方約定了一致的密鑰。在通信的源點(diǎn)用密鑰對(duì)核心數(shù)據(jù)進(jìn)行加密并形成密文,然后,以密文的形式在公共通信網(wǎng)中傳輸?shù)酵ㄐ啪W(wǎng)絡(luò)的終點(diǎn)。數(shù)據(jù)到達(dá)終點(diǎn)后,用同樣的密鑰對(duì)密文數(shù)據(jù)進(jìn)行解密,便再現(xiàn)了明文形式的核心數(shù)據(jù)。這樣,便保證了核心數(shù)據(jù)(如PIN、MAC等)在公共通信網(wǎng)中傳輸?shù)陌踩院涂煽啃浴?/p>
2匯編語言的實(shí)現(xiàn)
用匯編語言實(shí)現(xiàn)DES算法有它的優(yōu)勢(shì)也有它的難點(diǎn)。優(yōu)勢(shì)是51匯編的位操作可以方便地實(shí)現(xiàn)置換功能。但用匯編語言實(shí)現(xiàn)算法的迭代運(yùn)算及循環(huán)功能比較煩瑣。在用51匯編實(shí)現(xiàn)DES的過程中,我編寫了幾個(gè)子程序,組合起來可實(shí)現(xiàn)DES算法加密。在這里寫出一些思路,有需要的同行可與我聯(lián)系(E-mail:zhoubin@)。
8031有16個(gè)可以位尋址的寄存器,可放置128位的數(shù)據(jù),利用它可實(shí)現(xiàn)DES的轉(zhuǎn)置功能。將明文m放入寄存器27H~20H中,即位地址00H對(duì)應(yīng)m64,3FH對(duì)應(yīng)m1。利用標(biāo)志寄存器C可實(shí)現(xiàn)置換與逆置換程序。在DES的16次迭代過程中,要實(shí)現(xiàn)公式:
Li=Ri-1;Ri=Li-1f(Ri-1,ki)
的運(yùn)算過程,其關(guān)鍵在于f(Ri-1,ki)的功能。f是將32位的輸入轉(zhuǎn)化為32位的輸出。其中含3項(xiàng)技術(shù):
①將32位膨脹為48位的E功能。該項(xiàng)功能可用類似于置換功能的子程序編寫。
②48位子密鑰的生成。為了便于51匯編生成子密鑰,可以使用主機(jī)用串口下傳的方式,由主機(jī)將16個(gè)子密鑰傳給89C52為核心的單片機(jī),然后存入80H~FFH中。如果密鑰是固定的,則可直接將子密鑰固化在89C52的Flash中。
③S盒的功能是將48位的輸入再次縮為32位。具體實(shí)現(xiàn)是將S盒表存入89C52的Flash中,每次通過查表求得S輸出的結(jié)果。
下面列舉其中的幾個(gè)子程序。
(1)IP置換子程序
;入口寄存器:(MSB)2726252423222120(LSB),出口寄存器:(MSB)2F2E2D2C2B2A2928(LSB)
;功能:將入口寄存器的數(shù)據(jù)按置換表換位。
IP:MOVC,06H;將m58送到進(jìn)位標(biāo)志中
MOV7FH,C;將進(jìn)位標(biāo)志送m1中
MOVC,0EH;將m50送到進(jìn)位標(biāo)志中
MOV7EH,C;將進(jìn)位標(biāo)志送m2中
;重復(fù),按表編寫MOVC,31H;將m15送到進(jìn)位標(biāo)志中
MOV41H,C;將進(jìn)位標(biāo)志送m63中
MOVC,39H;將m7送到進(jìn)位標(biāo)志中
MOV40H,C;將進(jìn)位標(biāo)志送m64中
RET
(2)逆置換子程序
;入口寄存器:(MSB)2726252423222120(LSB),出口寄存器:(MSB)2F2E2D2C2B2A2928(LSB)
;功能:將入口寄存器的數(shù)據(jù)按逆置換表換位。
IPRVS:MOVC,18H;將m40送到進(jìn)位標(biāo)志中
MOV7FH,C;將進(jìn)位標(biāo)志送m1中
MOVC,38H
.
.
.
RET
(3)異或子程序
;入口寄存器:272625243F3E3D3C,出口寄存器:2B2A2928
;功能:將寄存器27262524的內(nèi)容和寄存器3F3E3D3C的內(nèi)容異或。結(jié)果保存在2B2A2928寄存器中。
XORLF:MOVA,3FH;將高8位異或
XRLA,27H
MOV2BH,A;放入出口處
MOVA,3EH
XRLA,26H
MOV2AH,A
MOVA,3DH
XRLA,25H
MOV29H,A
MOVA,3CH
XRLA,24H
MOV28H,A
RET
(4)S盒子程序
;入口寄存器:(MSB)2F2E2D2C2B2A2928,出口寄存器:(MSB)27262524
;功能:48位32位
S6TO4:MOV20h,2FH;取出高位數(shù)據(jù)
LCALLS162345;調(diào)用實(shí)現(xiàn)Si(b1b6,b2b3b4b5)
;的功能子程序
MOVDPTR,#S1TAB;S盒表的首址
MOVA,21H;取出第幾個(gè)S盒
LCALLDPTRADD
CLRA
MOVCA,@A+DPTR;求出S盒的表地址及S結(jié)果
SWAPA
MOV27H,A;保存高位結(jié)果
MOV20H,2EH
LCALLS162345
;重復(fù)
匯編語言傳送指令是匯編語言中使用的一些操作符和助記符,還包括一些偽指令。
用于告訴匯編程序如何進(jìn)行匯編的指令,它既不控制機(jī)器的操作也不被匯編成機(jī)器代碼,只能為匯編程序所識(shí)別并指導(dǎo)匯編如何進(jìn)行。
(來源:文章屋網(wǎng) )
棧是限定僅在表尾進(jìn)行插入和刪除操作的線性表。“?!闭?,存儲(chǔ)貨物或供旅客住宿的地方,可引申為倉庫、中轉(zhuǎn)站,引入到計(jì)算機(jī)領(lǐng)域里,就是指數(shù)據(jù)暫時(shí)存儲(chǔ)的地方,所以才有進(jìn)棧、出棧的說法。
棧是計(jì)算機(jī)中經(jīng)典的數(shù)據(jù)結(jié)構(gòu),棧就是限制在一端進(jìn)行插入刪除操作的線性表。棧有兩種最重要的操作,即pop和push。
(來源:文章屋網(wǎng) )
一、變量與函數(shù)的相互調(diào)用
c語言可以調(diào)用匯編子程序和匯編語言中定義的變量。但要注意由于。編譯后的目標(biāo)文件自動(dòng)地在函數(shù)名和變量名前加一個(gè)下劃線,所以在匯編語言中調(diào)用C語言的函數(shù)和變量時(shí),應(yīng)在函數(shù)名和變量名前加一下劃線。在匯編語言程序開始部分,應(yīng)對(duì)調(diào)用的函數(shù)和變量用EXTERN加以說明。
二、調(diào)用者與被調(diào)用者的參數(shù)傳遞
這種數(shù)據(jù)傳遞通過堆棧完成,在執(zhí)行調(diào)用時(shí)從調(diào)用程序參數(shù)表中的最后一個(gè)參數(shù)開始,即從右到左自動(dòng)依次壓人堆棧;將所有參數(shù)壓人堆棧后,再自動(dòng)將被調(diào)用程序執(zhí)行結(jié)束后的返回地址(斷點(diǎn))壓人堆棧,以使被調(diào)程序結(jié)束后能返回主調(diào)程序的正確位置而繼續(xù)執(zhí)行。進(jìn)人匯編子程序后,為了能正確獲取主調(diào)程序并存人堆棧中的數(shù)據(jù),被調(diào)的匯編子程序先后要做如下一些工作:
l、保存sp的副本進(jìn)人匯編子程序后,子程序中免不了要有壓棧和出棧的操作,故sP時(shí)刻在變化。為了能用SP訪問堆棧中的參數(shù),安全辦法是一進(jìn)人子程序后,先為SP制副本,以后對(duì)傳遞參數(shù)的訪問都用副本進(jìn)行。一般可用BP保存SP,如:pushbPmovbP,sp
2、保留數(shù)據(jù)空間如果匯編子程序中需要一些局部數(shù)據(jù),可以簡單地減小SP的值,以便在棧空間中保留出一段存貯區(qū),用于存放局部數(shù)據(jù),該區(qū)域須在子程序結(jié)束后恢復(fù)。如下語句可以保留一個(gè)局部數(shù)據(jù)區(qū):pushbPmovbP,spsubsp,spaee;設(shè)spaee=4如上語句段中,SPACE是局部數(shù)據(jù)的總字節(jié)數(shù)。在以后的應(yīng)用中,由于SP是變化的,而BP是固定的,用負(fù)偏移量可以存取局部變量。上例利用BP及偏移量,將兩個(gè)字的局部數(shù)據(jù)初始化為0。
3、保留寄存器值如果在被調(diào)子程序中用到sI、DI等其它寄存器,則應(yīng)先把它們壓人堆棧,以保留寄存器原值。例如,下例就是將SI和DI寄存器的值壓棧:pushbpmoybp,SpsubSp,sPaeePush51Pushdi
4、獲取傳遞參數(shù)BP保留了SP在參數(shù)傳遞完并將BP壓棧后的一個(gè)副本,利用BP可以很方便地訪問各參數(shù)。現(xiàn)假設(shè)調(diào)用了名為funcl匯編程序模塊的主函數(shù):maln(){……fund(pl,pZ,p3);……}。各參數(shù)都是2字節(jié)的整數(shù)值,返回地址retumaddress,在小模式編譯方式共占用2個(gè)字節(jié)。如果要將傳遞的參數(shù)p卜pZ、p3取出,并分別賦給bx、Cx、dx寄存器,可由下列語句完成這一功能:movbx,[bp+4jmovcx,[bp+6]movdx,[bp+8〕
一、變量與函數(shù)的相互調(diào)用
c語言可以調(diào)用匯編子程序和匯編語言中定義的變量。但要注意由于。編譯后的目標(biāo)文件自動(dòng)地在函數(shù)名和變量名前加一個(gè)下劃線,所以在匯編語言中調(diào)用C語言的函數(shù)和變量時(shí),應(yīng)在函數(shù)名和變量名前加一下劃線。在匯編語言程序開始部分,應(yīng)對(duì)調(diào)用的函數(shù)和變量用EXTERN加以說明。
二、調(diào)用者與被調(diào)用者的參數(shù)傳遞
這種數(shù)據(jù)傳遞通過堆棧完成,在執(zhí)行調(diào)用時(shí)從調(diào)用程序參數(shù)表中的最后一個(gè)參數(shù)開始,即從右到左自動(dòng)依次壓人堆棧;將所有參數(shù)壓人堆棧后,再自動(dòng)將被調(diào)用程序執(zhí)行結(jié)束后的返回地址(斷點(diǎn))壓人堆棧,以使被調(diào)程序結(jié)束后能返回主調(diào)程序的正確位置而繼續(xù)執(zhí)行。進(jìn)人匯編子程序后,為了能正確獲取主調(diào)程序并存人堆棧中的數(shù)據(jù),被調(diào)的匯編子程序先后要做如下一些工作:
l、保存sp的副本進(jìn)人匯編子程序后,子程序中免不了要有壓棧和出棧的操作,故sP時(shí)刻在變化。為了能用SP訪問堆棧中的參數(shù),安全辦法是一進(jìn)人子程序后,先為SP制副本,以后對(duì)傳遞參數(shù)的訪問都用副本進(jìn)行。一般可用BP保存SP,如:pushbPmovbP,sp
2、保留數(shù)據(jù)空間如果匯編子程序中需要一些局部數(shù)據(jù),可以簡單地減小SP的值,以便在??臻g中保留出一段存貯區(qū),用于存放局部數(shù)據(jù),該區(qū)域須在子程序結(jié)束后恢復(fù)。如下語句可以保留一個(gè)局部數(shù)據(jù)區(qū):pushbPmovbP,spsubsp,spaee;設(shè)spaee=4如上語句段中,SPACE是局部數(shù)據(jù)的總字節(jié)數(shù)。在以后的應(yīng)用中,由于SP是變化的,而BP是固定的,用負(fù)偏移量可以存取局部變量。上例利用BP及偏移量,將兩個(gè)字的局部數(shù)據(jù)初始化為0。
3、保留寄存器值如果在被調(diào)子程序中用到sI、DI等其它寄存器,則應(yīng)先把它們壓人堆棧,以保留寄存器原值。例如,下例就是將SI和DI寄存器的值壓棧:pushbpmoybp,SpsubSp,sPaeePush51Pushdi
4、獲取傳遞參數(shù)BP保留了SP在參數(shù)傳遞完并將BP壓棧后的一個(gè)副本,利用BP可以很方便地訪問各參數(shù)?,F(xiàn)假設(shè)調(diào)用了名為funcl匯編程序模塊的主函數(shù):maln(){……fund(pl,pZ,p3);……}。各參數(shù)都是2字節(jié)的整數(shù)值,返回地址retumaddress,在小模式編譯方式共占用2個(gè)字節(jié)。如果要將傳遞的參數(shù)p卜pZ、p3取出,并分別賦給bx、Cx、dx寄存器,可由下列語句完成這一功能:movbx,[bp+4jmovcx,[bp+6]movdx,[bp+8〕
關(guān)鍵詞: C 語言;匯編語言;混合編程
中圖分類號(hào):TP313 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1006-4311(2014)24-0231-02
0 引言
匯編語言是一種面向機(jī)器的語言,其優(yōu)點(diǎn)是運(yùn)行速度快,占用存儲(chǔ)空間小,可直接對(duì)硬件進(jìn)行控制。缺點(diǎn)是編寫、調(diào)試?yán)щy、移植性差。C語言簡潔、靈活、庫函數(shù)豐富、調(diào)試方便、移植性好,目前已被廣泛地應(yīng)用于系統(tǒng)軟件和應(yīng)用軟件的開發(fā)中,為了發(fā)揮各自優(yōu)勢(shì),取長補(bǔ)短,采用混合編程。大部分程序,如界面、人機(jī)接口(外殼程序)、數(shù)據(jù)處理等用C語言編寫,以提高程序的開發(fā)效率。而某些程序,如需要縮短程序的運(yùn)行時(shí)間,或需要對(duì)硬件進(jìn)行直接操作,或需要利用操作系統(tǒng)的某些功能模塊,或頻繁使用的程序、或需要占用內(nèi)存空間少的程序(內(nèi)核程序),則用匯編編寫,以提高程序的運(yùn)行效率。
1 嵌入式匯編
嵌入式匯編也稱行內(nèi)匯編,源程序中直接插入?yún)R編語句。匯編語句可直接訪問C程序中定義的常量、變量、函數(shù)。不必考慮二者之間的接口,方便編程。
1.1 嵌入式匯編語句的格式
格式:asm操作碼 操作數(shù)[;或換行]
其中:操作數(shù)可以是匯編語句中的立即數(shù)、寄存器、表達(dá)式等還可以是C中的常量、變量、標(biāo)號(hào)等。分號(hào);是匯編語句結(jié)束符,并非注解,要用注解,用C的注解。如下例
所示。
1.2 匯編語句訪問C的數(shù)據(jù)
嵌入的匯編語句可以訪問C語言程序中的任何標(biāo)識(shí)符,包括變量、常量、標(biāo)號(hào)、函數(shù)名、寄存器變量、函數(shù)參數(shù)等。如下例所示。
1.3 匯編語言與C語言接口規(guī)則
1.4 編譯過程
命令行鍵入命令:TCC-B-Iinclude-Llib 文件名.c即可. TCC會(huì)自動(dòng)調(diào)用TASM.EXE和TLINK.EXE,并且TLINK.EXE能正確的找到需要的.obj和.lib文件,要保證TC目錄下存在TASM.EXE文件。如果單步編譯,可能會(huì)碰到很多的問題,主要是TLINK.EXE不會(huì)自己去找.obj和.lib文件。該命令的功能是:.C編譯TCC.ASM匯編TASM.OBJ連接TLINK.EXE。
2 Turbo C模塊連接方式
C、匯編程序各自編程,各自編譯,然后連接在一起。
2.1 匯編語言與C語言接口規(guī)則
①命名約定:匯編的名字前加一個(gè)下劃線,C的名字前不加下劃線(編譯后內(nèi)部自動(dòng)加),以確保兩個(gè)模塊內(nèi)部名字一致。
3 結(jié)語
混合編程,主要涉及接口,匯編調(diào)C的函數(shù)、全局變量。C調(diào)匯編的函數(shù)、變量。本文對(duì)此做了淺述。
參考文獻(xiàn):
[1]譚浩強(qiáng).C語言程序設(shè)計(jì)[M].清華大學(xué)出版社,2004.