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