資料介紹
14.4 布爾表達(dá)式
14.4.1 范圍檢測(cè)
通常,布爾表達(dá)式被用來(lái)檢測(cè)某個(gè)數(shù)值是否在特定的范圍內(nèi)。例如,在圖形窗口處理程序中,常使用布爾表達(dá)式判斷屏幕中一個(gè)點(diǎn)是否在當(dāng)前活動(dòng)窗口范圍內(nèi)。
下面的程序使用結(jié)構(gòu)體定義點(diǎn)坐標(biāo)并計(jì)算坐標(biāo)的當(dāng)前位置。
bool PointInRect1(Point p, Rectangle *r)
{ return (p.x 》= r-》xmin && p.x 《 r-》xmax &&
p.y 》= r-》ymin && p.y 《 r-》ymax);
}
上面的功能函數(shù),被編譯為下面的指令序列。
PointInRect1
LDR a4,[a3,#0]
CMP a1,a4
BLT |L000034.J5.PointInRect1|
LDR a4,[a3,#4]
CMP a4,a1
BLE |L000034.J5.PointInRect1|
LDR a1,[a3,#8]
CMP a2,a1
BLT |L000034.J5.PointInRect1|
LDR a1,[a3,#&c]!
CMP a2,a1
MOVLT a1,#1
MOVLT pc,lr
|L000034.J5.PointInRect1|
MOV a1,#0
MOV pc,lr
但上面的代碼并不是最精簡(jiǎn)的。編譯器對(duì)(x 》= min && x 《 max)形式的布爾表達(dá)式的處理過程比較復(fù)雜。它將以(unsigned)(x-min) 《 (max-min)形式實(shí)現(xiàn)布爾操作。所有對(duì)于上面范圍判斷的代碼,建議將函數(shù)寫成如下形式。
bool PointInRect2(Point p, Rectangle *r)
{ return ((unsigned) (p.x - r-》xmin) 《 r-》xmax &&
?。╱nsigned) (p.y - r-》ymin) 《 r-》ymax);
}
這樣編譯出的匯編指令序列如下所示。
PointInRect2
LDR a4,[a3,#0]
SUB a1,a1,a4
LDR a4,[a3,#4]
CMP a1,a4
LDRCC a1,[a3,#8]
SUBCC a1,a2,a1
LDRCC a2,[a3,#&c]!
CMPCC a1,a2
MOVCS a1,#0
MOVCC a1,#1
MOV pc,lr
14.4.2 和零的比較操作
比較指令(CMP)將設(shè)置程序狀態(tài)字的條件標(biāo)志位。另外,基本的算術(shù)指令也可以設(shè)置條件標(biāo)志位,如使用指令MOVS、ADDS等。如果程序中的算術(shù)指令的執(zhí)行目的是為了將計(jì)算結(jié)果和零比較,那么就可以直接使用帶標(biāo)志擴(kuò)展的基本算術(shù)指令。如下面的兩條語(yǔ)句:
ADD R0, R0, R1
CMP R0, #0
可以合并為一條帶符號(hào)擴(kuò)展的加法指令:
ADDS R0, R0, R1
事實(shí)上,C語(yǔ)言中的和零相關(guān)的關(guān)系操作都可以利用狀態(tài)標(biāo)志寄存器的N位和Z位。如:x 《 0, x 》= 0, x = 0, x != 0,和無(wú)符號(hào)操作x = 0, x != 0 (or x 》 0)。
對(duì)于每一條C語(yǔ)言中的關(guān)系操作,匯編器都將產(chǎn)生一條比較指令。如果關(guān)系操作和零相關(guān),則可以將產(chǎn)生的比較指令移除。
下面是C語(yǔ)言中的關(guān)系操作被編譯的例子。
C源文件如下所示。
int g(int x, int y)
{
if ((x + y) 《 0)
return 1;
else
return 0;
}
編譯后的結(jié)果如下。
g
ADDS a1,a1,a2
MOVPL a1,#0
MOVMI a1,#1
MOV pc,lr
所以,在使用C語(yǔ)言編程時(shí),關(guān)系操作最好轉(zhuǎn)換成和零相關(guān)的,這樣既可以減少代碼密度,也可以提高程序的執(zhí)行效率。
C語(yǔ)言中,沒有和程序狀態(tài)寄存器的C位和V位直接相關(guān)的指令,所以要在程序中檢測(cè)這些標(biāo)志,只能使用內(nèi)嵌匯編。但C編譯器支持無(wú)符號(hào)溢出操作,下面的例子顯示了在有溢出操作時(shí),編譯器對(duì)程序的處理。
C源代碼如下所示。
int sum(int x, int y)
{
int res;
res = x + y;
if ((unsigned) res 《 (unsigned) x) /* 判斷進(jìn)位標(biāo)志是否進(jìn)位 */
res++;
return res;
}
編譯的匯編文件如下所示。
sum
ADDS a2,a1,a2
ADC a2,a2,#0
MOV a1,a2
MOV pc,lr
?
14.4.1 范圍檢測(cè)
通常,布爾表達(dá)式被用來(lái)檢測(cè)某個(gè)數(shù)值是否在特定的范圍內(nèi)。例如,在圖形窗口處理程序中,常使用布爾表達(dá)式判斷屏幕中一個(gè)點(diǎn)是否在當(dāng)前活動(dòng)窗口范圍內(nèi)。
下面的程序使用結(jié)構(gòu)體定義點(diǎn)坐標(biāo)并計(jì)算坐標(biāo)的當(dāng)前位置。
bool PointInRect1(Point p, Rectangle *r)
{ return (p.x 》= r-》xmin && p.x 《 r-》xmax &&
p.y 》= r-》ymin && p.y 《 r-》ymax);
}
上面的功能函數(shù),被編譯為下面的指令序列。
PointInRect1
LDR a4,[a3,#0]
CMP a1,a4
BLT |L000034.J5.PointInRect1|
LDR a4,[a3,#4]
CMP a4,a1
BLE |L000034.J5.PointInRect1|
LDR a1,[a3,#8]
CMP a2,a1
BLT |L000034.J5.PointInRect1|
LDR a1,[a3,#&c]!
CMP a2,a1
MOVLT a1,#1
MOVLT pc,lr
|L000034.J5.PointInRect1|
MOV a1,#0
MOV pc,lr
但上面的代碼并不是最精簡(jiǎn)的。編譯器對(duì)(x 》= min && x 《 max)形式的布爾表達(dá)式的處理過程比較復(fù)雜。它將以(unsigned)(x-min) 《 (max-min)形式實(shí)現(xiàn)布爾操作。所有對(duì)于上面范圍判斷的代碼,建議將函數(shù)寫成如下形式。
bool PointInRect2(Point p, Rectangle *r)
{ return ((unsigned) (p.x - r-》xmin) 《 r-》xmax &&
?。╱nsigned) (p.y - r-》ymin) 《 r-》ymax);
}
這樣編譯出的匯編指令序列如下所示。
PointInRect2
LDR a4,[a3,#0]
SUB a1,a1,a4
LDR a4,[a3,#4]
CMP a1,a4
LDRCC a1,[a3,#8]
SUBCC a1,a2,a1
LDRCC a2,[a3,#&c]!
CMPCC a1,a2
MOVCS a1,#0
MOVCC a1,#1
MOV pc,lr
14.4.2 和零的比較操作
比較指令(CMP)將設(shè)置程序狀態(tài)字的條件標(biāo)志位。另外,基本的算術(shù)指令也可以設(shè)置條件標(biāo)志位,如使用指令MOVS、ADDS等。如果程序中的算術(shù)指令的執(zhí)行目的是為了將計(jì)算結(jié)果和零比較,那么就可以直接使用帶標(biāo)志擴(kuò)展的基本算術(shù)指令。如下面的兩條語(yǔ)句:
ADD R0, R0, R1
CMP R0, #0
可以合并為一條帶符號(hào)擴(kuò)展的加法指令:
ADDS R0, R0, R1
事實(shí)上,C語(yǔ)言中的和零相關(guān)的關(guān)系操作都可以利用狀態(tài)標(biāo)志寄存器的N位和Z位。如:x 《 0, x 》= 0, x = 0, x != 0,和無(wú)符號(hào)操作x = 0, x != 0 (or x 》 0)。
對(duì)于每一條C語(yǔ)言中的關(guān)系操作,匯編器都將產(chǎn)生一條比較指令。如果關(guān)系操作和零相關(guān),則可以將產(chǎn)生的比較指令移除。
下面是C語(yǔ)言中的關(guān)系操作被編譯的例子。
C源文件如下所示。
int g(int x, int y)
{
if ((x + y) 《 0)
return 1;
else
return 0;
}
編譯后的結(jié)果如下。
g
ADDS a1,a1,a2
MOVPL a1,#0
MOVMI a1,#1
MOV pc,lr
所以,在使用C語(yǔ)言編程時(shí),關(guān)系操作最好轉(zhuǎn)換成和零相關(guān)的,這樣既可以減少代碼密度,也可以提高程序的執(zhí)行效率。
C語(yǔ)言中,沒有和程序狀態(tài)寄存器的C位和V位直接相關(guān)的指令,所以要在程序中檢測(cè)這些標(biāo)志,只能使用內(nèi)嵌匯編。但C編譯器支持無(wú)符號(hào)溢出操作,下面的例子顯示了在有溢出操作時(shí),編譯器對(duì)程序的處理。
C源代碼如下所示。
int sum(int x, int y)
{
int res;
res = x + y;
if ((unsigned) res 《 (unsigned) x) /* 判斷進(jìn)位標(biāo)志是否進(jìn)位 */
res++;
return res;
}
編譯的匯編文件如下所示。
sum
ADDS a2,a1,a2
ADC a2,a2,#0
MOV a1,a2
MOV pc,lr
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- Oracle中常用的函數(shù)與表達(dá)式講解
- 基于運(yùn)算符信息的數(shù)學(xué)表達(dá)式檢索技術(shù) 2次下載
- Python正則表達(dá)式指南 10次下載
- LabVIEW之表達(dá)式節(jié)點(diǎn)、公式節(jié)點(diǎn)和公式VI 23次下載
- Python正則表達(dá)式的學(xué)習(xí)指南 0次下載
- C語(yǔ)言指針的表達(dá)式實(shí)例程序說明 4次下載
- C++程序設(shè)計(jì)教程之數(shù)據(jù)類型與表達(dá)式的詳細(xì)資料說明 0次下載
- C語(yǔ)言實(shí)用教程之數(shù)據(jù)類型運(yùn)算符和表達(dá)式的詳細(xì)資料說明 10次下載
- C++入門教程之數(shù)據(jù)類型、運(yùn)算符和表達(dá)式的詳細(xì)資料說明 2次下載
- Python正則表達(dá)式教程之標(biāo)準(zhǔn)庫(kù)的完整介紹及使用示例說明 3次下載
- C語(yǔ)言教程之C語(yǔ)言中級(jí)培訓(xùn)教程—何謂表達(dá)式 0次下載
- 如何編寫C語(yǔ)言代碼中的乘法正確表達(dá)式詳細(xì)概述 4次下載
- C語(yǔ)言程序設(shè)計(jì)--運(yùn)算符與表達(dá)式
- 防范表達(dá)式的失控
- 基因表達(dá)式編程的2種解碼方法
- GVIM正則表達(dá)式介紹和使用示例 1357次閱讀
- 什么是正則表達(dá)式?正則表達(dá)式如何工作?哪些語(yǔ)法規(guī)則適用正則表達(dá)式? 3819次閱讀
- Java Lambda表達(dá)式的新特性 2618次閱讀
- OpenHarmony中使用正則表達(dá)式 1506次閱讀
- shell腳本基礎(chǔ):正則表達(dá)式grep 1285次閱讀
- Python中的Lambda表達(dá)式 851次閱讀
- 位邏輯運(yùn)算符與表達(dá)式 1284次閱讀
- 邏輯運(yùn)算符與表達(dá)式 2205次閱讀
- C語(yǔ)言的表達(dá)式 1405次閱讀
- 表達(dá)式與邏輯門之間的關(guān)系 1662次閱讀
- 運(yùn)算符/表達(dá)式規(guī)則 1032次閱讀
- RTL表達(dá)式和運(yùn)算符 1793次閱讀
- C語(yǔ)言如何使用正則表達(dá)式 4970次閱讀
- 教你如何輕松搞定Linux正則表達(dá)式 3645次閱讀
- 快速入門IPv6和正則表達(dá)式 9051次閱讀
下載排行
本周
- 148V到5KW無(wú)橋LLC雙向逆變器的電路原理圖免費(fèi)下載
- 0.26 MB | 154次下載 | 10 積分
- 22KW逆變側(cè)功率管的損耗如何進(jìn)行計(jì)算詳細(xì)公式免費(fèi)下載
- 0.40 MB | 32次下載 | 2 積分
- 3高功率密度碳化硅MOSFET軟開關(guān)三相逆變器損耗分析
- 2.27 MB | 30次下載 | 5 積分
- 4S7-200 可編程序控制器系統(tǒng)手冊(cè)
- 12.81 MB | 4次下載 | 免費(fèi)
- 5ATX電源 FSP_ATX-300PAF電路圖資料
- 0.18 MB | 1次下載 | 2 積分
- 6IP6541_L 150uA 低功耗,集成多種快充輸出協(xié)議中文資料
- 1.43 MB | 次下載 | 免費(fèi)
- 7PC5010 單通道20V_10A低邊高速驅(qū)動(dòng)器技術(shù)手冊(cè)
- 1.17 MB | 次下載 | 免費(fèi)
- 8GSV2201D 帶嵌入式MCU的DisplayPort 1.4到HDMI 2.0轉(zhuǎn)換器規(guī)格書
- 0.67 MB | 次下載 | 2 積分
本月
- 148V到5KW無(wú)橋LLC雙向逆變器的電路原理圖免費(fèi)下載
- 0.26 MB | 154次下載 | 10 積分
- 22KW逆變側(cè)功率管的損耗如何進(jìn)行計(jì)算詳細(xì)公式免費(fèi)下載
- 0.40 MB | 32次下載 | 2 積分
- 3高功率密度碳化硅MOSFET軟開關(guān)三相逆變器損耗分析
- 2.27 MB | 30次下載 | 5 積分
- 4STM32F10x參考手冊(cè)資料
- 13.64 MB | 12次下載 | 1 積分
- 5OAH0428 V1.0英文規(guī)格書
- 5.86 MB | 8次下載 | 免費(fèi)
- 6光伏并網(wǎng)逆變器原理
- 7.31 MB | 6次下載 | 2 積分
- 7NS1081/NS1081S/NS1081Q USB 3.0閃存數(shù)據(jù)手冊(cè)
- 0.40 MB | 4次下載 | 2 積分
- 8S7-200 可編程序控制器系統(tǒng)手冊(cè)
- 12.81 MB | 4次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935132次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191422次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183352次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81600次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73818次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65990次下載 | 10 積分
評(píng)論