資料介紹
14.4 布爾表達式
14.4.1 范圍檢測
通常,布爾表達式被用來檢測某個數值是否在特定的范圍內。例如,在圖形窗口處理程序中,常使用布爾表達式判斷屏幕中一個點是否在當前活動窗口范圍內。
下面的程序使用結構體定義點坐標并計算坐標的當前位置。
bool PointInRect1(Point p, Rectangle *r)
{ return (p.x 》= r-》xmin && p.x 《 r-》xmax &&
p.y 》= r-》ymin && p.y 《 r-》ymax);
}
上面的功能函數,被編譯為下面的指令序列。
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
但上面的代碼并不是最精簡的。編譯器對(x 》= min && x 《 max)形式的布爾表達式的處理過程比較復雜。它將以(unsigned)(x-min) 《 (max-min)形式實現布爾操作。所有對于上面范圍判斷的代碼,建議將函數寫成如下形式。
bool PointInRect2(Point p, Rectangle *r)
{ return ((unsigned) (p.x - r-》xmin) 《 r-》xmax &&
(unsigned) (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)將設置程序狀態字的條件標志位。另外,基本的算術指令也可以設置條件標志位,如使用指令MOVS、ADDS等。如果程序中的算術指令的執行目的是為了將計算結果和零比較,那么就可以直接使用帶標志擴展的基本算術指令。如下面的兩條語句:
ADD R0, R0, R1
CMP R0, #0
可以合并為一條帶符號擴展的加法指令:
ADDS R0, R0, R1
事實上,C語言中的和零相關的關系操作都可以利用狀態標志寄存器的N位和Z位。如:x 《 0, x 》= 0, x = 0, x != 0,和無符號操作x = 0, x != 0 (or x 》 0)。
對于每一條C語言中的關系操作,匯編器都將產生一條比較指令。如果關系操作和零相關,則可以將產生的比較指令移除。
下面是C語言中的關系操作被編譯的例子。
C源文件如下所示。
int g(int x, int y)
{
if ((x + y) 《 0)
return 1;
else
return 0;
}
編譯后的結果如下。
g
ADDS a1,a1,a2
MOVPL a1,#0
MOVMI a1,#1
MOV pc,lr
所以,在使用C語言編程時,關系操作最好轉換成和零相關的,這樣既可以減少代碼密度,也可以提高程序的執行效率。
C語言中,沒有和程序狀態寄存器的C位和V位直接相關的指令,所以要在程序中檢測這些標志,只能使用內嵌匯編。但C編譯器支持無符號溢出操作,下面的例子顯示了在有溢出操作時,編譯器對程序的處理。
C源代碼如下所示。
int sum(int x, int y)
{
int res;
res = x + y;
if ((unsigned) res 《 (unsigned) x) /* 判斷進位標志是否進位 */
res++;
return res;
}
編譯的匯編文件如下所示。
sum
ADDS a2,a1,a2
ADC a2,a2,#0
MOV a1,a2
MOV pc,lr
?
14.4.1 范圍檢測
通常,布爾表達式被用來檢測某個數值是否在特定的范圍內。例如,在圖形窗口處理程序中,常使用布爾表達式判斷屏幕中一個點是否在當前活動窗口范圍內。
下面的程序使用結構體定義點坐標并計算坐標的當前位置。
bool PointInRect1(Point p, Rectangle *r)
{ return (p.x 》= r-》xmin && p.x 《 r-》xmax &&
p.y 》= r-》ymin && p.y 《 r-》ymax);
}
上面的功能函數,被編譯為下面的指令序列。
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
但上面的代碼并不是最精簡的。編譯器對(x 》= min && x 《 max)形式的布爾表達式的處理過程比較復雜。它將以(unsigned)(x-min) 《 (max-min)形式實現布爾操作。所有對于上面范圍判斷的代碼,建議將函數寫成如下形式。
bool PointInRect2(Point p, Rectangle *r)
{ return ((unsigned) (p.x - r-》xmin) 《 r-》xmax &&
(unsigned) (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)將設置程序狀態字的條件標志位。另外,基本的算術指令也可以設置條件標志位,如使用指令MOVS、ADDS等。如果程序中的算術指令的執行目的是為了將計算結果和零比較,那么就可以直接使用帶標志擴展的基本算術指令。如下面的兩條語句:
ADD R0, R0, R1
CMP R0, #0
可以合并為一條帶符號擴展的加法指令:
ADDS R0, R0, R1
事實上,C語言中的和零相關的關系操作都可以利用狀態標志寄存器的N位和Z位。如:x 《 0, x 》= 0, x = 0, x != 0,和無符號操作x = 0, x != 0 (or x 》 0)。
對于每一條C語言中的關系操作,匯編器都將產生一條比較指令。如果關系操作和零相關,則可以將產生的比較指令移除。
下面是C語言中的關系操作被編譯的例子。
C源文件如下所示。
int g(int x, int y)
{
if ((x + y) 《 0)
return 1;
else
return 0;
}
編譯后的結果如下。
g
ADDS a1,a1,a2
MOVPL a1,#0
MOVMI a1,#1
MOV pc,lr
所以,在使用C語言編程時,關系操作最好轉換成和零相關的,這樣既可以減少代碼密度,也可以提高程序的執行效率。
C語言中,沒有和程序狀態寄存器的C位和V位直接相關的指令,所以要在程序中檢測這些標志,只能使用內嵌匯編。但C編譯器支持無符號溢出操作,下面的例子顯示了在有溢出操作時,編譯器對程序的處理。
C源代碼如下所示。
int sum(int x, int y)
{
int res;
res = x + y;
if ((unsigned) res 《 (unsigned) x) /* 判斷進位標志是否進位 */
res++;
return res;
}
編譯的匯編文件如下所示。
sum
ADDS a2,a1,a2
ADC a2,a2,#0
MOV a1,a2
MOV pc,lr
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- Oracle中常用的函數與表達式講解
- 基于運算符信息的數學表達式檢索技術 2次下載
- Python正則表達式指南 10次下載
- LabVIEW之表達式節點、公式節點和公式VI 23次下載
- Python正則表達式的學習指南 0次下載
- C語言指針的表達式實例程序說明 4次下載
- C++程序設計教程之數據類型與表達式的詳細資料說明 0次下載
- C語言實用教程之數據類型運算符和表達式的詳細資料說明 10次下載
- C++入門教程之數據類型、運算符和表達式的詳細資料說明 2次下載
- Python正則表達式教程之標準庫的完整介紹及使用示例說明 3次下載
- C語言教程之C語言中級培訓教程—何謂表達式 0次下載
- 如何編寫C語言代碼中的乘法正確表達式詳細概述 4次下載
- C語言程序設計--運算符與表達式
- 防范表達式的失控
- 基因表達式編程的2種解碼方法
- GVIM正則表達式介紹和使用示例 845次閱讀
- 什么是正則表達式?正則表達式如何工作?哪些語法規則適用正則表達式? 1666次閱讀
- Java Lambda表達式的新特性 2428次閱讀
- OpenHarmony中使用正則表達式 1058次閱讀
- shell腳本基礎:正則表達式grep 1043次閱讀
- Python中的Lambda表達式 704次閱讀
- 位邏輯運算符與表達式 1125次閱讀
- 邏輯運算符與表達式 1805次閱讀
- C語言的表達式 1152次閱讀
- 表達式與邏輯門之間的關系 1400次閱讀
- 運算符/表達式規則 830次閱讀
- RTL表達式和運算符 1465次閱讀
- C語言如何使用正則表達式 4690次閱讀
- 教你如何輕松搞定Linux正則表達式 3523次閱讀
- 快速入門IPv6和正則表達式 8720次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1490次下載 | 免費
- 2單片機典型實例介紹
- 18.19 MB | 92次下載 | 1 積分
- 3S7-200PLC編程實例詳細資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關電源原理及各功能電路詳解
- 0.38 MB | 10次下載 | 免費
- 6基于AT89C2051/4051單片機編程器的實驗
- 0.11 MB | 4次下載 | 免費
- 7藍牙設備在嵌入式領域的廣泛應用
- 0.63 MB | 3次下載 | 免費
- 89天練會電子電路識圖
- 5.91 MB | 3次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應用800例(新編版)
- 0.00 MB | 33562次下載 | 免費
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關電源設計實例指南
- 未知 | 21539次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537791次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183277次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論
查看更多