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