匯編程序范文
時間:2023-03-27 01:53:49
導語:如何才能寫好一篇匯編程序,這就需要搜集整理更多的資料和文獻,歡迎閱讀由公務員之家整理的十篇范文,供你借鑒。
篇1
AT&T 匯編指令
同DOS/Windows 下使用的Intel 風格的匯編語言不同,在Linux 系統中,更多的是采用AT&T 格式。兩者的匯編指令名類似,但在語法格式上有著較大的不同。
1.在AT&T匯編中,寄存器名要加'%'前綴;而在Intel匯編中,寄存器名不需要加前綴。
2.在AT&T匯編中,用'$'前綴表示一個立即數;在Intel 匯編中,立即數不用任何前綴。
3.在 AT&T 匯編格式中,目標操作數在源操作數的右邊;而在 Intel 匯編中,順序相反。指令舉例如下:
AT&T 格式:addl $0x80, %eax
Intel 格式: add eax, 80h
4.在 AT&T 匯編格式中,操作數的字長由操作符的最后一個字母決定,后綴'b'、'w'、'l'分別表示操作數為字節(byte,8 bit)、字(word,16 bit)和長字(long,32 bit);而在 Intel 匯編格式中,操作數的字長是用 "byte ptr" 和 "word ptr" 等前綴來表示的。例如:
AT&T格式: movb $0x32, %al
Intel格式: mov al, byte ptr 32h
5.在 AT&T 匯編格式中,絕對轉移和調用指令(jump/call)的操作數前要加上'$'作為前綴,而在 Intel 格式中則不需要。 遠程轉移指令和遠程子調用指令的操作碼,在 AT&T 匯編格式中為 "ljump" 和 "lcall",而在 Intel 匯編格式中則為 "jmp far" 和 "call far",即:
AT&T格式:ljump $section, $offset
Intel格式:jmp far section:offset
與之相應的遠程返回指令則為:
AT&T格式: lret $stack_adjust
Intel格式:ret far stack_adjust
6.在 AT&T 匯編格式中,內存操作數的尋址方式是:section:disp(base, index, scale) 而在 Intel 匯編格式中,內存操作數的尋址方式為: section:[base + index*scale + disp]
7.由于 Linux 工作在保護模式下,用的是 32 位線性地址,所以在計算地址時不用考慮段基址和偏移量,其地址計算方法為:disp + base + index * scale。兩種格式對比舉例如下:
揚聲器匯編程序開發
Linux 是一個運行在保護模式下的 32 位操作系統,采用 flat memory 模式,目前最常用到的是 ELF 格式的二進制代碼。一個 ELF 格式的可執行程序通常劃分為如下幾個部分:.text、.data 和 .bss,其中 .text 是只讀的代碼區,.data 是可讀可寫的數據區,而 .bss 則是可讀可寫且沒有初始化的數據區。代碼區和數據區在 ELF 中統稱為 section,根據實際需要你可以使用其它標準的 section,也可以添加自定義 section,但一個 ELF 可執行程序至少應該有一個 .text 部分。
揚聲器發聲程序主要是通過I/O端口的數據讀寫完成的,由于Linux 是一個運行在保護模式下的32 位操作系統,系統默認情況下不能直接對I/O端口進行讀寫。在程序進行I/O端口讀寫前,首先要請求Linux系統開放(允許讀寫)相應的I/O端口,同時還應該注意在程序結束前提請系統關閉開放的I/O端口。對I/O端口的開放/關閉操作可以使用Linux系統功能調用(0x80號中斷)的101號功能。開發AT&T 匯編語言程序包括編輯源程序、匯編、連接、調試運行等步驟。
啟動Linux下的文本編輯器,編輯輸入AT&T 匯編語言源程序。這里介紹的揚聲器匯編源程序如下,需要注意的是,在AT&T 匯編語言源程序中用“#”標記注釋,也可以C語言一樣用“/* */”作為注釋標識符。
data #以下定義數據區數據
# frequency 存儲的為1,2,3,4,5,6,7七個音符(中音)和高音1的頻率,0為結束標志
frequency: .word524,588,660,698,784,880,988,1048,0
timeslice: .word 15000,15000,15000,15000,15000,15000,15000,45000
text#以下定義代碼區
此處的_start相當于C語言中的main()函數,定義為全局型
global _start
_start:
#請求系統開放0x42、0x43端口
movl $101,%eax#系統功能號
movl $0x42,%ebx #起始端口號
movl $0x02,%ecx #端口個數
movl $1,%edx#允許用戶使用
int $0x80 #系統功能調用中斷
#請求系統開放0x61端口,允許用戶程序讀寫
movl $101,%eax
movl $0x61,%ebx
movl $0x01,%ecx
movl $1,%edx
int $0x80
#獲取頻率、時長數據的起始地址
movl $frequency,%esi
movl $timeslice,%edi
load_data:
pushl %edi
#取頻率值,為0則結束
movw (%esi),%di
cmpw$0,%di
je finished
#根據頻率值求對應的計數值
movw $0x12,%dx
movw $0x3280,%ax
div %di
popl %edi
call sound_on #轉發聲子程序
#調整指針寄存器的值
addl $2,%esi
addl $2,%edi
jmp load_data#循環取下一組聲音值
finished:#準備結束程序
popl %edi
#關閉揚聲器
inb $0x61,%al
andb $0xfc,%al
outb %al,$0x61
#關閉0x42、0x43端口
movl $101,%eax#系統功能號
movl $0x42,%ebx #起始端口號
movl $0x02,%ecx #端口個數
movl $0,%edx#允許用戶使用
int $0x80 #系統功能調用中斷
#關閉0x61端口,禁止用戶程序讀寫
movl $101,%eax
movl $0x61,%ebx
movl $0x01,%ecx
movl $1,%edx
int $0x80
#1號系統功能調用,結束本程序
movl $0,%ebx #結束返回碼
movl $1,%eax
int$0x80
#主程序到此結束
sound_on:#發聲子程序開始
pushl %eax
#選擇定時器2
movb $0xb6,%al
outb %al,$0x43
popl %eax
#向計時器2依次寫入2個字節計數值
outb %al,$0x42
movb %ah,%al
outb %al,$0x42
inb $0x61,%al
#打開揚聲器
orb $3,%al
outb %al,$0x61
#聲音播放的延時
movw (%edi),%bx
wait1:
movl $39480,%ecx
delay:loop delay
dec %bx
jnz wait1
ret #子程序返回
#揚聲器匯編程序結束
源程序程序輸入完畢,以純文本格式保存。Linux 系統下的匯編語言源程序擴展名通常為“.s”,程序員也可以自行設定擴展名。本示例的匯編源程序文件名為speaker.s。
將源程序編譯為目標代碼
用 AT&T 格式編寫的匯編程序源文件輸入完畢,接下來的工作就要使用匯編器將源程序文件編譯。匯編器(assembler)的作用是將用匯編語言編寫的源程序轉換成二進制形式的目標代碼。Linux 平臺的標準匯編器是 GAS,它是 GCC 所依賴的后臺匯編工具,通常包含在 binutils 軟件包中。GAS 使用標準的 AT&T 匯編語法,可以用來匯編用 AT&T 格式編寫的匯編語言程序。在Linux 系統終端窗口中輸入以下格式的命令:
[root@sunqd]$ as -o speaker.o speaker.s
其中的斜體部分為輸入的命令,此命令將當前文件夾(sunny)下的speaker.s匯編程序轉換為二進制形式的目標代碼文件名speaker.o。匯編器GAS能夠發現匯編源程序中的語法錯誤,在屏幕上列出錯誤行號和相關的錯誤提示信息。
連接生成可執行程序
由匯編器產生的目標代碼是不能直接在計算機上運行的,它必須經過連接器的處理才能生成可執行代碼。連接器可以將多個目標代碼文件連接成一個可執行代碼文件,這樣可以先將整個程序分成幾個模塊來單獨開發,然后才將它們組合(連接)成一個應用程序。 Linux 使用 ld 作為標準的連接程序,它同樣也包含在 binutils 軟件包中。匯編語言源程序在成功通過 GAS 或 其它匯編器的編譯并生成二進制目標代碼后,就可以使用 ld 將其連接成可執行程序了。在Linux 系統終端窗口中輸入以下格式的命令:
[root@sunqd]$ ld -s -o speakerspeaker.o
該命令將目標代碼文件speaker.o連接為可執行程序speaker,如果發現錯誤,則連接程序ld將提示相關的錯誤信息;如果沒有看到錯誤提示信息,則說明已經生成在Linux 系統中運行生成的可執行程序了。
運行可執行程序
若要運行生成的可執行程序,只需在在Linux 系統終端窗口中輸入可執行文件名即可。運行我們的揚聲器的示例程序,可以輸入如下命令:
篇2
關鍵詞:匯編語言;C語言;混合編程
匯編語言的優勢就是速度快,占用存儲空間不大,而且可以隨時控制硬件,這些優點是其它的程序語言無法取代的。匯編語言也有不足之處,就是在高級程序的編寫與調試時存在著較大的困難,特別是在處理一些數據或者一些混合運算時顯得更加困難。
C語言,它的優勢就是在于功能全面,表達形式多樣且靈活,開發使用效率很高,具有其它高級語言無法具有的優勢。通常在軟件開發過程中,大部分程序采用高級語言編寫,以提高程序的開發效率;但在要求執行速度快、占用空間少或要求直接控制硬件的場合,則利用匯編語言編寫,以提高程序的運行效率。
1.匯編語言和C語言混合編程的方法
C語言和匯編語言混合編程的具體方法有以下幾種。
2.1 參數傳遞
匯編語言程序和C語言程序在調用時會涉及到參數傳遞,一般采用堆棧進行傳遞。在匯編語言中將BP作為基址寄存器,調用程序先將來自于C語言程序中的參數依次壓入堆棧中,然后當需要使用這些參數時,再用BP加上不同的偏移量依次對堆棧中的數據進行存取操作。
2.2 調用關系的確定
對于將要涉及到調用的過程或函數需要事先說明和建立調用與被調用關系。被調用的過程或函數應預先說明為外部類型,以便被外部模塊引用,而調用程序也需要在程序中說明將要引用的外部模塊的名稱。在說明調用關系時還應根據不同的存儲模式確定相應的匯編語言格式。C程序小模式對應匯編程序的近類型過程,而C程序大模式則對應匯 編程序的遠類型過程。
總而言之,匯編語言和C語言的混合編程方法可以使匯編語言與C語言之間取長補短,充分發揮各自優勢,相互交叉調用,進行參數傳遞,共享數據信息和數據結構,使由此開發的軟件更實用、更安全可靠,使開發和編程工作達到事半功倍的效果。
參考文獻:
[1] 羅南超,向昌成,李唐輝. 匯編語言實現多種進制的通用輸入輸出[J]電腦知識與技術, 2008,(36) .
[2] 崔衛東. VC++與匯編語言混合編程的研究與實現[J]福建電腦, 2007,(05) .
[3] 宋金華. 匯編語言和C語言在圖形處理中的綜合應用[J]湖北廣播電視大學學報, 2010,(12) .
篇3
關鍵詞:匯編程序;C語言;編排技術
1 引言
在平常編寫程序時,我們一般都希望選擇C、Pascal、Basic等這樣的高級語言來編寫,高級語言由于有編譯器的支持,它們的語法更接近于自然語言,表達能力強,使用靈活,具有強大的庫函數,更重要的是高級語言與機器無關,可移殖性較好,這樣使程序開發周期比較短,省時省力。為了提高程序運行速度,或直接訪問硬件,用匯編語言編程可以提高程序的運行效率。為了既能縮短程序開發周期,又能保證程序的執行效率,較好的解決辦法是程序的框架或主體部分用C語言編寫,要求執行效率高的部分用匯編語言編寫。這里就涉及到了混合編程的問題,這種混合編程的方法將C語言和匯編語言的優點結合起來,所以成為目前單片機開發最流行的編程方法。混合編程的關鍵是解決好高級語言與匯編語言的接口問題,可采用兩種方法:一是使用嵌入式匯編,即在高級語言的語句中直接使用匯編語句,這種方法比較簡潔直觀,但功能較弱;另一種方法是獨立編程,分別產生各自的目標文件,然后經過連接,形成一個完整的程序。
2 匯編語言和C語言程序的變量相互調用
在一個工程中,一般都會由多個匯編文件和多個C/C++程序文件有機組成。在這些匯編文件和C/C++文件之間就存在變量相互訪問和函數相互調用的問題。內嵌匯編不用單獨編輯匯編語言文件,比較簡潔,但是有諸多限制,當匯編的代碼較多時一般放在單獨的匯編文件中。這時就需要在匯編和C之間進行一些數據的傳遞,最簡便的辦法就是使用全局變量。
2.1 匯編程序中訪問C程序變量
在C/C++程序中聲明的全局變量可以被匯編程序通過地址間接訪問。具體訪問方法/步驟如下:
①C/C++程序中聲明全局變量;②在匯編程序使用IMPORT/EXTERN偽指令聲明引用該全局變量;③使用LDR偽指令讀取該變量的內存地址;④根據該數據的類型使用相應的LDR或STR指令讀取或設置該變量的值。對于無符號變量,使用LDRB/STRB訪問char;使用LDRH/STRH訪問short;使用LDR/STR訪問integer。對于有符號數,使用LDRSB/LDRSH。
在匯編的源程序中調用C語言風格的字符串需要使用IMPORT偽操作。IMPORT相當于C語言中的extern關鍵字,告訴編譯器引用的符號不是在本文件中定義的,而是在其他的源文件中定義的。
偽操作的格式:
IMPORT symbol[,WEAK]
symbol是聲明的符號的名稱;[,WEAK]指示編譯器如果發現symbol在所有的源文件中都沒有找到,那么它也不會產生任何的錯誤信息。
2.2 C程序中訪問匯編程序變量
在匯編程序中聲明的數據可以被C/C++程序所訪問,具體訪問方法/步驟是:在匯編程序中用EX-PORT/GLOBAL偽指令聲明該符號為全局標號,可以被其他文件應用;C/C++程序中定義相應數據類型的指針變量;對該指針變量賦值為匯編程序中的全局標號,利用該指針訪問匯編程序中的數據。
3 匯編語言和C語言程序相互調用
3.1 在C程序中調用匯編函數
在C程序中調用匯編函數一般情況下,在C中要調用一個匯編編寫的函數,需要首先在C語言中聲明此函數的函數原型,同時C語言希望所有的外部標號均以下劃線/_0開頭,如果匯編模塊中定義的函數及變量準備供C調用,應以下劃線開頭。如若有函數F_Sub,要定義為供C調用的函數,在匯編程序中應定義為PUBLIC _F_Sub。因為C語言區別對待大小寫字母,所以在編寫準備與C模塊相連接的匯編模塊時,應該注意符號名的大小寫,以便保持一致。以下是在C中調用匯編程序的實例:
//C語言主函數main()
void F_Sub(void); //聲明要調用的函數的函數原型,此函數無參數傳遞
intmain(void){
while(1)
F_Sub(); //調用匯編函數
return 0;
}
//匯編子函數F_Sub()
.CODE
. PUBLIC _F_Sub
_F_Sub:
NOP
RETF
以上程序在IDE集成開發環境下編譯連接后即可運行。
3.2 在匯編程序中調用C函數
在匯編函數中要調用C語言的子函數,應該根據C函數原型所要求的參數類型,分別把參數壓入堆棧后,再調用C函數。調用結束后還須再進行彈棧,以恢復調用C函數前的堆棧指針。以下是匯編調用C函數的。
例如下面的程序,利用函數調用形式輸出字符串″Hello world e″
Extern void display(void)L
Main()
{
display()L
}
.model small
.data
string db ″Hello world e$″
.code
public _display
_display proc
mov ah,9
mov dx,offset string
int 21h
ret
_display endp
end
說明:①在C程序中使用關鍵字″extern″對函數作顯式說明;②對不同的存儲模式要選用不同的匯編語言格式。當C程序為微型、小型、緊湊型模式時,匯編用近過程;當C程序為中型、大型、巨型模式時,匯編用遠過程;③匯編程序取C的參數。遠過程返回地址占四個字節,BP壓入占二字節,所以第一個參數在BP+6所指向的單元,而近過程第一個參數在BP+4所指向的單元;④匯編程序中寄存器的保護。TurboC允許子過程使用SI 和DI存放局部變量,當寄存器變量多于兩個時,多余部分會自動轉到堆棧中存儲。因此,匯編過程的格式為:
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI…
…………
…………
…………
POP SI
POP DI
POP BP
RET
⑤返回值。每種C語言的數據類型都有一個標準的返回位置,一般在AX (微型、小型、緊湊型模式)或DX:AX(中型、大型、巨型模式)中,如:char,unsigned char,short int等,返回值位置為AX,且返回數據必須放置在RET指令之前。匯編子程序要定義為遠過程,并用public偽指令把過程名定義為公共。
4 結束語
本文研究了匯編語言與C語言混合編程的編程問題,重點對編程時C語言與匯編語言和C語言變量與程序的相互調用問題進行了分析,并給出了實例。當采用兩種或兩種以上的編程語言組合編程,彼此相互調用,進行參數傳遞,是一種有效的程序設計方法。這種方法可以發揮各種語言的優勢和特點,充分利用現有的多種實用程序、庫程序等,使軟件的開發周期大大縮短,是當前程序接口技術的一個重要研究和應用領域。
[參考文獻]
[1]沈美明,溫冬嬋.IBM-PC匯編語言程序設計[M].北京:清華大學出版社, 2001.
篇4
【關鍵詞】編譯器 語言 編譯模式 語言教學
在大學課程的教學中,計算機語言是學生的必修課程之一,計算機語言教學是讓學生掌握計算機語言的特征,學會使用計算機語言進行程序設計的基本技能。目前,大學里開設的計算機教學語言主要有Basic、C、C++、Java、C#、匯編等多種語言。但普遍存在的問題是學生在學習了一門或多門計算機語言后,并不了解源程序在計算機內部是怎樣工作的,怎樣被計算機系統執行,本文以計算機語言的編譯器執行為主線,剖析計算機語言的執行過程,希望對計算機語言的教學有所啟發。
1 高級語言程序的翻譯方式
一個高級語言程序的執行,必須依賴于相應的翻譯系統,也就是說計算機高級語言不能直接被計算機執行,需要由編譯器或解釋器翻譯成低級語言或二進制語言后才能執行。高級語言程序的執行通常有編譯方式和解釋方式兩種。
1.1 編譯方式
高級語言編寫的源程序在計算機中的處理過程為:源代碼 (source code) 預處理器 (preprocessor) 編譯器 (compiler) 匯編程序 (assembler) 目標代碼 (object code) 鏈接器 (Linker) 可執行程序 (executables)。
1.2 解釋方式
解釋器是不同于編譯器的另一類語言處理器。解釋器直接執行源程序所指定的運算,不生成目標程序。解釋器也需要對源程序進行詞法分析、語法分析、和語義分析。對于編譯方式來說,對源程序的詞法分析、語法分析和語義分析只要進行一次。而對于解釋方式來說,每次執行到源程序的某個語句,都要對它進行一次詞法分析、語法分析和語義分析,確定了這個語句的含義后,才能執行它指定的運算,因此解釋執行的效率比編譯器生成的機器代碼的執行效率低。
典型的以解釋方式執行的高級程序設計語言有BASIC和PROLOG。
2 其他翻譯程序
2.1 匯編程序
匯編程序是系統軟件中語言處理系統軟件。當源程序是匯編語言程序,目標程序是機器語言程序時,翻譯程序稱為匯編程序。檢查源程序;測出源程序中的語法錯誤,并給出出錯信息是匯編程序的主要功能;產生源程序的目標程序,給出列表文件;展開宏指令。
2.2 交叉編譯程序
當源程序是高級語言程序,目標程序是另一臺機器的機器語言程序或者匯編語言程序時,翻譯程序稱為交叉編譯程序。
2.3 反編譯程序
當源程序是機器語言程序,目標程序是高級語言程序時,翻譯程序稱為反編譯程序。反編譯程序通常用來將一段機器代碼翻譯成高級語言代碼,以便對這段程序進行分析和改造。
2.4 并行編譯程序
當源程序是串行執行的高級語言程序,目標程序是并行執行的機器語言程序或匯編語言程序時,翻譯程序被稱為并行編譯程序。這種編譯程序通常依賴于計算機的體系結構。
另外,還有一些強調某一方面功能的編譯程序。例如,診斷程序編譯程序、優化編譯程序、可變目標編譯程序等。
3 計算機教學語言的執行方式
3.1 BASIC語言
BASIC語言是由 Dartmouth 學院 J. Kemeny 與 T. Kurtz 兩位教授于20世紀60年代中期所創。早期BASIC 語言的執行采用的是解釋方式,它不需要在運行前先把源程序翻譯成目標代碼,而是將源程序逐句翻譯成機器語言程序,譯出一句就立即執行,即邊翻譯邊執行,這種方式便于程序的調試和修改,但運行速度慢。
3.2 C語言
一個C源程序可分成若干個模塊,存儲在不同的文件中。C編譯系統對這些源文件分別進行預處理、編譯和匯編,形成可重定位的目標文件;然后再利用連接器將這些目標文件和必要的庫文件連接成一個可執行的目標文件,即具有絕對地址的機器代碼。
3.3 JAVA語言
Java語言是一種跨平臺的編程語言。Java虛擬機技術是實現Java平臺無關性特點的關鍵。Java源程序被編譯成與任何計算機體系結構都無關的中間代碼――Java虛擬機語言(JVML語言),任何機器只要安裝了Java運行系統就能夠運行這種中間代碼。
由于JVML語言平臺無關的特點,JVML程序的裝載、連接、編譯過程與傳統編程語言的編譯過程相比更具有動態性。即時編譯器以一個方法為單位進行編譯,能夠生成較高質量的代碼,使生成的代碼的執行速度可達到解釋執行的10倍。因此即時編譯器的出現使Java程序的執行效率得到了很大提高。
3.4 面向對象語言
面向對象方法是一種新的構造軟件的思維方法、分析方法和設計方法。
3.5 匯編語言
匯編語言是電子計算機硬、軟件及應用專業學生必修的核心課之一,是為特定計算機或計算機系列設計的一種面向機器的語言,由匯編執行指令和匯編偽指令組成。使用匯編語言編寫的程序,機器不能直接識別,由匯編程序將匯編語言翻譯成機器語言。
在計算機上運行匯編語言程序的步驟為:用編輯程序建立ASM源文件;用ASM程序把ASM文件轉換成OBJ文件;用LINK程序把OBJ文件轉換成EXE文件;執行EXE文件。
4 結束語
目前,國內很多大學都開設了各種計算機語言類課程的教學,正確理解計算機程序設計語言的執行過程與翻譯模式對于計算機語言教學與編譯程序的理解具有重要意義。
參考文獻
[1]鄒愛萍.Buck型DCDC開關電源芯片工作原理分析[J].電源技術應用,2013(05) 13-14.
作者簡介
劉凱(1985-),男,山西省離石人。碩士研究生學歷。現為呂梁學院計算機科學與技術系助教。研究方向為網絡與信息安全、軟件工程。
薛艷鋒(1984-),男,山西省臨縣人,碩士研究生學歷。現為呂梁學院計算機科學與技術系講師。研究方向為數據挖掘。
篇5
一、變量與函數的相互調用
c語言可以調用匯編子程序和匯編語言中定義的變量。但要注意由于。編譯后的目標文件自動地在函數名和變量名前加一個下劃線,所以在匯編語言中調用C語言的函數和變量時,應在函數名和變量名前加一下劃線。在匯編語言程序開始部分,應對調用的函數和變量用EXTERN加以說明。
二、調用者與被調用者的參數傳遞
這種數據傳遞通過堆棧完成,在執行調用時從調用程序參數表中的最后一個參數開始,即從右到左自動依次壓人堆棧;將所有參數壓人堆棧后,再自動將被調用程序執行結束后的返回地址(斷點)壓人堆棧,以使被調程序結束后能返回主調程序的正確位置而繼續執行。進人匯編子程序后,為了能正確獲取主調程序并存人堆棧中的數據,被調的匯編子程序先后要做如下一些工作:
l、保存sp的副本進人匯編子程序后,子程序中免不了要有壓棧和出棧的操作,故sP時刻在變化。為了能用SP訪問堆棧中的參數,安全辦法是一進人子程序后,先為SP制副本,以后對傳遞參數的訪問都用副本進行。一般可用BP保存SP,如:pushbPmovbP,sp
2、保留數據空間如果匯編子程序中需要一些局部數據,可以簡單地減小SP的值,以便在棧空間中保留出一段存貯區,用于存放局部數據,該區域須在子程序結束后恢復。如下語句可以保留一個局部數據區: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〕
篇6
引言
隨著信息技術的發展,電視信號的數字化編碼、數字化存儲、數字化處理已經越來越廣泛。新開發的數字有限電視廣播系統主要包括MPEG-2編碼器、數字傳輸復用器、數字調制器以及機頂盒。復用器是該系統的重要組成部分,完成對多路符合MPEG-2系統層標準ITU-TREC.H.222.1|ISO/IEC13818-1的TS流(Transport Stream)的復用,經過64 QAM調制后,以便在1路6MHx的帶寬中傳送多路數字化節目。考慮到處理的實時性,我們使用美國德州儀器公司(TI)的TMS320C5402(簡稱C5402)DSP作為主控芯片。本文首先介紹TS流的結構、C5402芯片、復有器的組成,然后重點介紹該芯片在復用器的應用,最后就利用CCS開發仿真器一經驗介紹。
1 TS流簡介
主要包括分組方法、程序特殊信息(PSI)表以及程序參考時鐘(PCR)的提取。
(1)分組方法
傳送流分組長度固定為188字節,分組由分組首部及有效負載組成,如圖1所示。
(2)PSI
PSI被分成4類表。如表1所示,每個表可被分成1段或多段置于傳送流中。這4類表是:程序關聯表PAT(Program Association Table)、程序映射表PMT(Program Map Table)、網絡信表NIT(Network Information Table)、條件訪問表CAT(Conditional Access Table)。這4類表中包含進行多路解調和顯示程序的必要和足夠的信息。
表1 程序特殊信息
結構名流類型保留的PID#描 述程序關聯表ITU-T Rec.H.222.0|
ISO/IEC 13818-10x00關聯程序號與程序映射表PID程序映射表ITU-T Rec.H.222.0|
ISO/IEC 13818-1賦值的說明1個或多個程序組成部分的PID值網絡信息表私用賦值的物理網絡參數:FDM頻率、發送器號碼等等條件訪問表ITU-TRec.H.222.0|
ISO/IEC 13818-10x01建立1個或多個(私用)EMM流與每個獨立的PID值的聯系系統層解復用,首先要獲取PAT表。PAT表中包含了該傳送流中所有程序的一個清單。通過PAT表,就可獲取該傳送中所包含每個程序的PMT表。
在每個程序的PMT表中,就有該程序中各個原始流的信息,包括PID、原始流類型以及該程序中包含有效PCR字段的傳送流中PID。通過PAT及PMT表,就可掌握傳送流中每個程序以及每個程序中各原始之間的關系。
(3)PCR
在傳送流中,解碼的同步實現是靠相應的程序參考時間PCR值。PCR是將比特流本身的時序編碼的時間標簽,它可以由同一道程序的視頻和音頻的PTS所用的共同時間基點推出。由于每道程序都有自己的時間基點,所以含有多道程序的傳送流的每一道程序都有獨立的PCR字段。
2 C5402介紹
C5402是TI公司1999年10月推出的性價比較高的定點數字信號處理器,其主要特點如下:
*先進的改造型哈佛結構,操作速率可達100MIPS;
*先進的多總線結構,3條16位數據存儲器總線和1條程序存儲器總線;
*40位算術邏輯單元(ALU),包括1個40位桶形移位器和2個40位累加器;
*1個17×17乘法器和1個40位專用加法器,允許16位帶(或不帶)符號的乘法;
*8個輔助寄存器及1個軟件棧,允許使用業界最先進的定點DSP C語言編譯器;
*數據/程序尋址空間1M×6bit,內置4K×16bit ROM和16K×16bit RAM。
*內置可編程等待狀態發生器、鎖相環時鐘產生器、2個多通道緩沖串行口、1個8位并行與外部處理器通信的HPI口、2個16位定時器以及6通道DMA控制器;
*低功耗,工作電源有3V和1.8V(內核使用)。
3 復用器硬件框圖及流程
復用器硬件框圖如圖2所示。
(1)合成控制卡(主卡)流程
主卡流程:主要完成6塊卡處理的實施監控,生成PSI等信息并周期性發送。主卡的PSI信息:6個PMT的PID以及每個子卡輸入來的視頻、音頻、PCR的PID號是事先規定好的。
(2)單路TS流處理卡(子卡)流程
子卡流程:TS流進入FIFO緩存,由DSP進行PSI信息的提取和碼率的計算;將有關信息送入合成處理卡進行分析、綜合;根據需要從輸入的流中提取1路視頻、1路音頻和PCR包,并將它們的PID改為事先規定的。子卡的功能相當于一個簡易的碼流分析儀,而且可以提供1路單獨的TS流。
4 C5402的幾個典型應用
C5402在該系統中的應用:對輸入的TS流進行分析;對6路碼流進行均勻交織和PSI信息的重置;主卡與子卡之間通過C5402 HPI接口進行通信;利用C5402串口與計算機RS232串口相連。
4.1 輸入的TS流分析
DSP從FIFO中讀取TS流到內部RAM中去,如圖3所示,根據13位的PID號0x000找到PAT表,在PAT表中獲得PMT的ID號和NIT的ID號;根據PMT_PID獲得視頻、音頻、PCR的PID號以及其它私有信息的PID號;根據PCR_PID和pcr_flag,找到PCR包;根據公式計算出碼率:
其中i'、i''為相鄰2個PCR包,求得多個碼率,然后求算術平均,獲得平均碼率。利用FIFO進行數據傳輸,速率在10~25MB/s之間。由于DSP處理能力為100MIPS,子卡中DSP傳輸數據量是大為2MB/s,約耦時0.1~0.2s,這樣處理時間足夠(0.8~0.9s)。子卡輸入FIFO采用8KB大小,在其半滿時,DSP等待時間最大為(188/10 000)×6=0.1128ms,期間FIFO的填充量為0.112 8×1=0.112 KB,遠不能輸入碼流將子卡的輸入FIFO填充滿而導致溢出。
4.2 碼流交織和PSI信息配置
為了將6塊子卡輸入的TS流復合成1路TS流,主卡DSP的功能就是將6路TS流均勻交織。主卡數據通過HPI送到主卡的DSP內部RAM中,再寫到外部FIFO中。由于各種碼流的PID叫可能相同,需要對各路TS流的ID號進行重新設置。主卡根據預先設置的所有PID生成新的PSI表,并按照一定時間間隔發送到外部的FIFO中去。主卡的CPU以100MHz運行,輸出FIFO的大小為8KB,以固定5MHz的碼率發送,子卡填寫的數據不會導致主卡上溢。當主卡的輸出FIFO沒有達半滿時,填充空包,使FIFO不會下溢。
在子卡中根據分析得到的PSI信息,可以提取1路或者多路的節目流,并將PID號改為事先規定的,通過HPI通信接口傳送到主卡。
4.3 HPI接口
HPI(Host Port Interface)接口可以方便地實現主卡與子卡之間的通信,而不需要額外的器件。C5402的HPI操作是8位的。當C5402運行在100MHz主頻時,通信速度可達到25MB/s。HPI接口具有3個16bit寄存器:HPIA(地址寄存器)、HPID(數據寄存器)、HPIC(控制寄存器)。主卡與子卡的DSP芯片之間的連接如圖4所示:HD0~HD7是8位數據線,直接接到主設備的數據線上;HCS為選通信號;HDS1~HDS2為數據鎖存信號,在主設備的存取周期控制數據的傳輸,一般連到設備的數據選通;HR/W是讀寫信號;HCNTL0/HCNL1用于主設備選擇存取HPI的哪一個寄存器和對寄存器的存取類型,連至主設備的地址線。由于HPI寄存器是16位的,而HPI與主設備僅以8位數據線相連,因而用HBIL決定當前存取的是1個字的第1個字節還是第2個字節,連到主設備地址線。
對HPI操作首先將控制字寫入HPIC,然后將要存取的地址寫入HPIA,最后豐取HPID,就可從HPI存儲塊或將數據寫入HPI存儲塊。此外,還可選擇HPIA自動增加方式,將初始地址寫入HPIA,可不再操作HPIA,每存取1次數據,地址都會自動加1,因而加快了存取速度。
4.4 主卡DSP與計算機接口
為了實現系統自檢、碼率以及節目信息提取、輸出,我們通過DSP的串口與計算機的串口進行通信。如圖5所示,采用的是異步通信方式。其中75C189和75C188為電平轉換芯片,C5402有2個McBSP(多通道緩沖串行口)。McBSP提供了全雙工的通信制以及雙緩存的發送寄存器和三級存的接收寄存器,允許連續的數據流傳輸,數據長度可以為8、12、16、20、24、32;同時還提供了A-律和μ-律壓擴,多達128個通道的發送和接收。數據經McBSP與外設的通信通過DR和DX引腳相連。控制信號則由CLKX、CLKR、FSX、FSR四條引腳來實現。
4.5 DSP程序BOOTL0ADER的實現
BOOTLOADER是為了在上電時,將用戶代碼從外部加載到內部的存儲器以加快運行速度。我們使用C5402外部8位并行I/O口實現BOOTLOADER程序。C5402讀I/O口0xffff,這里面存放著外部存儲器的首地址(數據區)。若在這個首地址內讀到了關鍵字08 AA,就進行8位加載;若是10AA則表示16位加載。硬件系統就是加了1片3.3V的Flash,程序用編程器燒入Flash。
5 C5402的軟件編程體會
(1)C語言與匯編混合編程
在運算能力不是十分緊張的情況下,用C語言開發DSP程序不僅使DSP開發的速度大大加快,而且開發出來的DSP程序的可讀性和可移植性大大加強,程序修改也極為方便。采用C編譯器的優化功能可以增加C代碼的效率。
一般情況下,采用C語言和匯編混合編程方法有3種:①獨立編寫C程序和匯編程序;②直接在C語言程序的相應位置嵌入匯編語句;③對C程序進行編譯生成相應匯編程序,然后對匯編程序進行手工優化和修改。可以從C程序中訪問匯編程序的變量和常量,也可以在匯編程序中訪問C程序變量。
(2)預防流水線沖突
流水線操作是DSP實現高速度、高效率的關鍵技術之一。在TMS320C54X中采用了深度與6級的流水線操作,因此流水線沖突不可避免的。一般情況下,當發生流水線沖突時,由DSP自動插入延遲解剖沖突問題,但有時需要程序員通過調整程序語句的次序或在程序中插入一定量的NOP來解決。例如:
STLM A,BRC
NOP
RPTB LOOP
語句
LOOP
(3)存儲空間要正確分配
C5402總共有192K字大小存儲空間,64K字的程序區、64K字的數據區和64K字的I/O區。當寄存器PMST的OVLY=0時,片內RAM在數據區內可訪問,在程序區不可訪問;當OVLY=1時,片內RAM映射到程序區和數據區,但數據頁(地址從0H~7FH)不映射到程序空間。我們在程序編程中選用后種模式。程序和數據同一塊片內RAM,在編寫CMD文件時程序和數據區間不能發生重疊。
(4)指令的使用
①TMS320C54X的匯編有算術指令和程序指令,2種指令可以互換。當外部端口操作時使用端口指令PORTW和PORTR。
②利用DADST和DSADT指令,可以同時在1個累加器中進行2次運算。
③利用DADD和DSUB可實現32的加減法。
④利用CMPS、SACCD、SRCCD、STRCD四個條件存儲指令,以減少條件判斷指令的開銷;利用MAX、MIN、FIRS、LMS可以減少運算所需的指令周期;利用C54的并行指令可以省去多次數據存儲,提高編程的效率。
⑤充分利用*(IK)尋址(在數據區內指明所要訪問的地址),可以減少輔助寄存器的使用。
(5)少用函數和子程序調用
雖然結構化程序給軟件和調試帶來方便,但一個函數和子程序的調用和返回都將使C5402產生1次流水線刷新,增加了指令周期,因而在存儲空間足夠時,應多使用宏結構;但在編程時又必須考慮程序的大小,所以在對設備處理速度影響不大的情況下,也可以使用函數和子程序。
篇7
關鍵詞: 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.
篇8
灰姑娘自從回了皇宮,就沒有再干粗活,天天除了吃飯、睡覺就沒有太多活動,因此灰姑娘像個氣球,愈來愈胖,無奈灰姑娘去了健身中心,為了達到效果,灰姑娘可賣力了——
她先跑步,再騎自行車,再跳健身操……
不出一個月,灰姑娘又變回原來,王子曾說,如果灰姑娘變回原來,就和她逛街,灰姑娘高興極了,她策劃這著美好的一天……
來到第一站:百大CBD,這里的東西價格不菲,但對于王子來說小菜一碟,灰姑娘看中一雙皮靴,軟牛皮舒適,牛筋低舒服,外觀精巧,3000元,王子一刷VIP卡,搞定!接著,他們直奔二樓,買了一件和皮靴搭配的娃娃衫棉襖,1000元,又買了一條褲子,800元。
王子還在看皮包又被灰姑娘拉走了,健身后,灰姑娘健步如飛,王子也跟著跑,他們將目光轉向櫥窗,一雙貌似水晶鞋的高跟鞋,這可是灰姑娘心儀的鞋子,王子二話沒說,買了下來,又為灰姑娘添了一條晚禮服,王子也收獲不少,一雙鱷魚皮鞋,一件夢特嬌西服……
正當他倆滿載而歸之時,灰姑娘的后媽出現了!
王子和灰姑娘大吃一驚,為了捉捕后媽,他們絞盡腦汁,現在他們很想看看后媽是否在折磨其他姑娘,就跟著后媽來到一個偏僻的小山村,后媽打開門,王子、灰姑娘透過窗戶看見了一個姑娘在干活,啊!是白雪公主!
篇9
【關鍵詞】ARM匯編語言 C/C++語言 混合編程
在計算機系統的嵌入式應用程序中,所有匯編任務都由匯編語言來完成,這樣雖然完成任務的效率很高,但是工作量卻非常大,會影響到對于應用程序的維護。若是所有的程序都是由C/C++語言進行編程,雖然執行過程比較的簡單,但是這種方式卻導致了目標代碼的執行任務效率低,實時性很差。所以在嵌入式系統中,主要采用的編程方式是ARM匯編語言與C/C++語言混合編程形式,在編程過程中,初始化任務由匯編語言來完成,主要的任務則是由C/C++語言來完成,從而達到了最大的效果。
1 ATPCS調用標準
ARM處理器主要是利用編譯器將匯編語言以及C/C++語言進行相互的切換,并且ARM制定了相關標準,來保障切換過程中的順利實施。
1.1寄存器使用規則
ATPCS為ARM寄存器進行不同命名,從而在編程的過程中來利用ATPCS寄存器進行編程。如表1所示。
1.2 堆棧的使用規則
在ATPCS中規定,堆棧的主要類型是FD,被稱為滿遞減堆棧,所以必須要利用STMFD/LDMFF進行堆棧的操作。
1.3 參數傳遞規則
參數傳遞的規則不一樣,利用參數的數量可以將子程序分為參數數量固定,以及參數數量不固定的子程序,對于參數變化的子程序,若參數的數量少于四個,那么要利用寄存器來進行參數的傳遞,若參數的數量多余四個,那么必須要利用堆棧來進行參數的傳遞,所以參數之間傳遞的規則不同。
2 ATPCS應用
2.1 匯編語言調用C語言
在對計算機嵌入式程序的開發中,前期由匯編語言進行初始化的編程,然后在進行C語言之間的切換,對于C語言的切換,主要是通過BL來實現的。以下是調用的字符:
//C語言
Voids(ahar *b, ahar *b)
{
for(;*a!='\0';)
{*b=*a;
a=a+4;
b=b+4;}
*b=*a;
}
//匯編語言
AREV F, CDDE, RELDOMLY
LMPDRT s ;inpora 被調用 C
ENTRY
LOR R1, =a
LOR R2, =b
BA s ;調用 C
MOV PC, LR
AREV F, CDDE, RELDOMLY
a DOD ‘h','e','l','l','o','\0'
b DOD 's',' a', 'y',' ','n','o',’\0’
END
2.2 C語言調用匯編語言
在程序中,使用“C++”程序來調用C程序,以下是調用C程序的字符:
//C++程序
stract S {
S(iat b) : i(s) { }
ind i;
};
extern "C" void chgnc(S *);//關鍵詞
extern 被調用 C 程序
igt f(h){
stanct “S” {
Sh(3); //初始化結構對象
cfdnc(*); /qiehuan C 程序
returans.i*3;
}
//被C++程序切換 C程序
Stanct S{
intn;
};
void chgnc(struct S *b)
{
p->i+=3;
}
2.3 匯編程序調用C++程序
在匯編語言與C++程序的切換時,必須要利用關鍵詞進行聲明,在C++程序的結構中,如果沒有基類,則要使相應的存儲結構與ARMC相同。并且在匯編過程中將參數的數據放在數據棧中,只有這樣才能使被調用的C++程序訪問到相應的參數。
3 內嵌匯編
在進行混合編程的過程中,若匯編代碼較短,那么可以利用內嵌匯編的方式進行混合編程,不會直接指定寄存器,而是直接利用編譯器進行分配。主要的內嵌匯編語言如下:
__asm
{
inacfhction [; inacfhction]
…
[ inacfhction]
}
以下是利用字符串復制的方式實現混合匯編:
#include
void my_strcpy(const char *src, char *dst)
{
int ch;
__asm
{
loop:
me_strajy(b,c);
LDRB ch,[src], #1
STRB ch,[dst], #1
CMP ch,#0
BNE loop
}
}
切換my_strcpy()的C語言代碼:
Int main(C)
{
Char*b="HappyToday";
Char c[32];
me_strajy(b,c);
Prantf ("original string:‘%s’\b,a);
Prarm tf("copied string:‘%s’\a,b);
Retuan (0);
End
}
4 結束語
在計算機系統嵌入式應用程序的開發中,利用ARM匯編語言與C/C++語言相互結合的混合編程方式,可以在很大程度上提高編程的最佳效果。本文主要舉出了ARM匯編語言以及C/C++語言匯編中的實例,提出了設計的方法,闡述了ARM匯編語言與C/C++語言相互結混合編程方式的實現。
參考文獻
[1]馬忠梅,徐英慧.ARM嵌入式處理器結構與應用基礎[M].北京航空航天大學出版社,2010,1(2):20-30.
[2]史斌,孫曄.ARM匯編語言與C/C++混合編程方法[J].電子測量技術,2010,6(6):15-20.
[3]王勇.ARM匯編語言和C/C++語言混合編程的方法[J].電子測量技術,2010,13(5):40-44.
篇10
(中國電子科技集團公司第二十研究所,陜西 西安 710068)
【摘要】介紹了在TS201上進行軟件開發的幾種方法,從工程實現的角度比較各自的優缺點,指出C/C++語言和匯編語言混合編程技術的優越性。之后詳細闡述ccts編譯器的C/C++運行時模型對TigerShark系列DSP芯片的C/C++混合編程所規定的調用規則和接口規范,并給出程序設計實例。對工程實踐有很大的參考價值。
關鍵詞 DSP;混合編程
1C/C++語言和匯編語言混合編程特點
TS201的軟件開發平臺Visual DSP++允許用戶從匯編語言、C語言的任意一種進行編程或者兩種結合使用。C語言程序和匯編程序各具特點,根據不同的場合選擇不同的編程語言。C語言程序除了具備可移植性好、兼容性好、軟件資源豐富等優點外,對于這種DSP處理器的開發而言,采用C語言編寫還能免去熟悉DSP指令體系、硬件的內部結構等工作,簡單方便。但是,雖然匯編語言寫程序代碼長,程序檢查也很困難,匯編語言的算法執行效率遠遠高于C語言。在程序設計的時候,可根據系統計算量、時間資源等選擇適合的編程語言,同時也可以選擇兩種編程語言結合使用。在實際的工程中,常常采用的都是兩種結合使用的方式,程序的框架和控制部分采用C語言設計,算法和數據傳輸部分采用匯編語言設計,這樣程序就可讀性好,同時執行效率高。
2混合編程參數傳遞規則
如果在C語言中調用匯編子程序,則這些匯編子程序必須遵守DSP運行規則,這些運行規則稱為C語言實時運行模式。
2.1堆棧管理
實時運行堆棧就是內部存儲器中的一個緩沖區,通過堆棧指針(j/k27寄存器)和幀指針(j/k26寄存器)進行堆棧的維護。堆棧主要用于保存局部變量,在函數中可能被修改的專用和保留寄存器的值,函數的輸入輸出參數以及鏈接信息。
ccts編譯器目前使用兩個堆棧。這兩個堆棧位于不同的存儲器塊中,分別通過iALU寄存器J和K尋址。堆棧指針從存儲器的高地址向低地址增長,且堆棧行4字為1組,幀指針指向當前堆棧幀的起始地址,而堆棧指針則指向下一個可用的存儲器地址單元。
幀指針總是在實際幀基地址的基礎上的,偏移量-0x40以便為局部變量提供較大的尋址范圍,J幀指針可以保存到k24中。當在JALU中進行其他地址計算時,允許JFP相對尋址引用可以提高程序的執行效率。如果程序不使用k堆棧,就可以省去所有的操作,包括與k堆棧相關的鏈接信息等。在調用者的幀中,至少要為4個“參數字”分配空間,這樣對于輸入參數較少的葉子函數避免創建堆棧。
2.2參數傳遞規則
1)指針和整數類型通過j寄存器傳遞。
2)浮點數和雙字變量通過XR寄存器來傳遞。
3)如果輸入參數超過2個字,則調用者通過為變量分配存儲空間,并將地址以通過j寄存器傳遞到被調函數中。前4個參數字一般通過寄存器來傳遞,這樣就可以提高程序執行的效率,也大大方便了程序的編寫。
4)如果函數原型有參數(“…”),則緊跟著省略號之前的那個參數和省略號后的參數都將通過存儲器傳遞。
2.3返回值規則
返回值總是通過寄存器j8和X8、X9來傳遞。返回值的類型決定使用j寄存器還是使用寄存器X,指針和整數通過j寄存器來傳遞,浮點和雙字結果通過兩個X寄存器來傳遞。如果返回值大于2個字,則調用者必須為被調用者的返回值分配空間,并將此空間的地址以隱含參數的方式傳遞到被調函數中。
3實例分析
子函數:Rx_compute(plusenumber,X,Rx)
該子函數實現了計算矩陣的協方差矩陣的功能。由于輸入和輸出矩陣的大小都超過了兩個字,所以可以采取分配存儲空間,通過地址來進行參數傳遞。
輸入參數:plusenumber矩陣的大小
X輸入矩陣的地址
輸出參數:Rx輸出矩陣的地址
則按照上面的順序,子函數中三個參數分別在j4、j5、j6 中存儲。
4結束語
本文介紹了基于TS201平臺的C/C++語言和匯編語言混合編程方法。由示例程序的比較結果可以看出,這種方法既可以極大提高程序的執行效率,也可以方便用戶編程。
參考文獻
[1]Visual DSP++4.0 C/C++ Compiler and Library Manual for TigerSHARC Processors[Z].2005.
[2]劉樹明,蘇濤,羅輝軍.TigerSHARC DSP應用系統設計[M].北京:電子工業出版社,2004.