II.C語言本質(zhì)_18x86匯編程序基礎(chǔ)_3第二個匯編程序_第1頁
II.C語言本質(zhì)_18x86匯編程序基礎(chǔ)_3第二個匯編程序_第2頁
II.C語言本質(zhì)_18x86匯編程序基礎(chǔ)_3第二個匯編程序_第3頁
II.C語言本質(zhì)_18x86匯編程序基礎(chǔ)_3第二個匯編程序_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第18章x86匯編程序基礎(chǔ)3.第二個匯編程序例18.2.求一組數(shù)的最大值的匯編程序#PURPOSE: This program finds thef maximum number of aiI #set of data items.1i #IbVARIABLES: The registers have| the following uses:Ir r# %edi - Holds the in dex of thedata item being exam ined# %ebx - Largest data item found:# %eax - Current data item! #| # T

2、he followingmemory locationsare used:! #1kI # datatems- con tai nsthe item1i data. A 0 is usedk11 # to termi nate the dataE#.secti on .datadata_items:#These are the data itemso ng3,67,34,222,45,75,54,34,44,33,22,11,66,0.secti on .text.globl _start_start:movl $0, %edi# move 0 intothe in dex registerm

3、ovl data_items(,%edi,4),%eax# load the first byte of datamovl %eax, %ebx# since thisis the first item, %eax is# the biggeststart loop:#start loopcmpl $0, %eax# check tosee if weve hit the endje loop_exitincl %edi# load n extvaluemovl data_items(,%edi,4),%eaxcmpl %ebx, %eax# comparevaluesjle start lo

4、op# jump toloop begi nning if the new# one isntbiggermovl %eax, %ebx# move thef value as the largestijmp start_loop# jump toj loop beginning j loop_exit:i # %ebx is the status code for theI I _;_exit system callj # and it already has the maximumJ movl $1, %eax#1 is the_exit() syscallj int $0 x80匯編、鏈

5、接、運(yùn)行:這個程序在一組數(shù)中找到一個最大的數(shù),并把它作為程序的退出狀態(tài)。這組數(shù) 在.data段給出:.long指示聲明一組數(shù),每個數(shù)占32位,相當(dāng)于C語言中的數(shù)組。這個數(shù)組開 頭定義了一個符號data_items,匯編器會把數(shù)組的首地址作為 data_items符號 所代表的地址,data_items類似于C語言中的數(shù)組名。data_items這個標(biāo)號沒有用.globl聲明,因?yàn)樗辉谶@個匯編程序內(nèi)部使用,鏈接器不需要用到這個 名字。除了ong之外,常用的數(shù)據(jù)聲明還有:.byte,也是聲明一組數(shù),每個數(shù)占 8位.ascii ,例如.ascii Hello world,聲明11個數(shù),取值為相應(yīng)字

6、 符的ASCII碼。注意,和C語言不同,這樣聲明的字符串末尾是 沒有0字符的,如果需要以0結(jié)尾可以聲明為.ascii Hello world0。data_items數(shù)組的最后一個數(shù)是0,我們在一個循環(huán)中依次比較每個數(shù),碰到0的時候讓循環(huán)終止。在這個循環(huán)中:*edi寄存器保存數(shù)組中的當(dāng)前位置,每次比較完一個數(shù)就把edi的值 加1,指向數(shù)組中的下一個數(shù)。 ebx寄存器保存到目前為止找到的最大值,如果發(fā)現(xiàn)有更大的數(shù)就更新ebx的值。 eax寄存器保存當(dāng)前要比較的數(shù),每次更新edi之后,就把下一個數(shù)讀到eax中。sta rt:Imovl $0, %edi初始化edi,指向數(shù)組的第0個元素I movl

7、data_items(,%edi,4), %eax這條指令把數(shù)組的第0個元素傳送到eax寄存器中。data_items是數(shù)組的首地 址, edi的值是數(shù)組的下標(biāo),4表示數(shù)組的每個元素占4字節(jié),那么數(shù)組中第edi 個元素的地址應(yīng)該是data_items + edi * 4,寫在指令中就是data_items(,%edi,4),這種地址表示方式在下一節(jié)還會詳細(xì)解釋。movl %eax, %ebxebx的初始值也是數(shù)組的第0個元素。下面我們進(jìn)入一個循環(huán),循環(huán)的開頭定義 一個符號start_loop ,循環(huán)的末尾之后定義一個符號 loop_exit 。比較eax的值是不是0,如果是0就說明到達(dá)數(shù)組末尾

8、了,就要跳出循環(huán)。cmpl 指令將兩個操作數(shù)相減,但計(jì)算結(jié)果并不保存,只是根據(jù)計(jì)算結(jié)果改變eflags寄存器中的標(biāo)志位。如果兩個操作數(shù)相等,則計(jì)算結(jié)果為 0, eflags中的ZF位 置1。je是一個條件跳轉(zhuǎn)指令,它檢查 eflags中的ZF位,ZF位為1則發(fā)生跳 轉(zhuǎn),ZF位為0則不跳轉(zhuǎn),繼續(xù)執(zhí)行下一條指令??梢姳容^指令和條件跳轉(zhuǎn)指令 是配合使用的,前者改變標(biāo)志位,后者根據(jù)標(biāo)志位決定是否跳轉(zhuǎn)。je可以理解成“jump if equal ”,如果參與比較的兩數(shù)相等則跳轉(zhuǎn)。incl %edimovl data_items(,%edi,4), %eax將edi的值加1,把數(shù)組中的下一個數(shù)傳送到eax寄存器中cmpl %ebx, %eaxj jle start_loop把當(dāng)前數(shù)組元素eax和目前為止找到的最大值ebx做比較,如果前者小于等于后 者,則最大值沒有變,跳轉(zhuǎn)到循環(huán)開頭比較下一個數(shù),否則繼續(xù)執(zhí)行下一條指令。 jle 表示“ jump if less than or

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論