匯編程序范文

時(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.