計算機系統基礎 7 分支程序的實現

簡單條件轉移指令

? ? ? ? 根據單個標志位的值(CF, SF,OF,PF,ZF)來確定是否轉移, 如果條件成立,則(EIP) + 位移量 ? EIP,否則什么也不做。

? ? ? ? 注意,這里的EIP在執行本條指令時就已經變成當前指令的下一條指令的地址了,如下例, 0096827D是jnz l1的下一條指令地址,加上機器碼75 07中表示偏移量的07就是l1所在處00968284

   mov  eax, x
00968270   A1 11 90 9D 00       mov   eax,dword ptr [x (09D9011h)]  cmp  eax, y
00968275  3B 05 15 90 9D 00    cmp  eax,dword ptr [y (09D9015h)]  jnz  l1
0096827B  75 07                       jne   l1 (0968284h)  mov  ecx,1
0096827D   B9 01 00 00 00        mov    ecx,1  jmp  l2
00968282   EB 05                      jmp    l1+5h (0968289h)  
l1: mov  ecx,0
00968284  B9 00 00 00 00          mov         ecx,0  
l2:
00968289   ……

JZ / JE?????? ZF=1時,轉移

JNZ / JNE???? ZF=0時,轉移

JS??????????? SF=1時,轉移

JNS?????????? SF=0時,轉移

JO??????????? OF=1時,轉移

JNO?????????? OF=0時,轉移

JC??????????? CF=1時,轉移

JNC?????????? CF=0時,轉移

JP / JPE????? PF=1時,轉移

JNP / JPO???? PF=0時,轉移

無符號條件轉移指令??

JA / JNBE?? 標號?? ( CF=0 且 ZF=0,轉移)

JAE / JNB?? 標號?? ( CF=0 或 ZF=1,轉移)

JB / JNAE?? 標號?? ( CF=1 且 ZF=0,轉移)

JBE / JNA?? 標號?? ( CF=1 或 ZF=1,轉移)

有符號條件轉移指令?

JG / JNLE?? 標號:當 SF=OF 且 ZF=0時,轉移

JGE / JNL?? 標號:當 SF=OF 或者 ZF=1時,轉移

JL / JNGE?? 標號:當 SF≠OF 且 ZF=0時,轉移

JLE / JNG?? 標號:當 SF≠OF 或者 ZF=1時,轉移

?兩種JMP格式

????????間接轉移方式中,除了立即數尋址方式外,其它方式均可以使用。

?功能等價的轉移指令:

1. JMP L1

2. JMP BUF

3. LEA EBX,BUF

? ? JMP DWORD PTR [EBX]

4. MOV EBX,BUF

? ? JMP EBX

指令地址列表?

? ? ? ? ?如果要根據不同的輸入跳轉執行不同的程序片段,如果要JMP來寫會非常麻煩。采用的方法是構造指令地址列表

? ? ? ? 比如,

????????FUNCTAB? DD? LP1, LP2, LP3

????????JMP? FUNCTAB[EBX*4]

????????(EBX)=0;跳轉到 LP1

????????(EBX)=1;跳轉到 LP2

?????????又如,

void arraysubtract_colsfirst( )? {……}

void arraysubtract_rowsfirst( )? {……}

void arraysubtract_onedim ( )? {……}

int main()

{

??? int?? i;

??? void (*funcp[3])() = { arraysubtract_colsfirst ,

??????????????????????????????????? arraysubtract_rowsfirst,

????????????????????????????????? ??arraysubtract_onedim };

??? funcp[i]();?? // i=0,1,2 會執行不同的函數

??? …….

}

這樣也做到了從多分支到無分支的轉化,比如下面例子

6.3.1 多分支向無分支的轉化

例:當x==1時,顯示‘HelloOne’

??? x==2時,顯示‘Two’

??? x==3時,顯示‘Welcome,Three’,……,

??? x為不同的值,顯示不同的串。

void myprint()
{   int  x;char msg1[] = "Hello,One";char msg2[] = "Two";char msg3[] = "Welcome, Three";char *p[3] = { msg1,msg2,msg3 };printf("please input 0,1,2 \n");scanf("%d", &x);printf("%s\n", p[x]);
}

編譯優化上的利用

編譯層面上可以利用這種轉化實現優化:

比如對下面這個子函數的優化:

???????int absdiff(int x, int y){int result;if (x < y)result = y - x;elseresult = x - y;return result;}

無分支的寫法:

int absdiff(int x, int y)

; _x$ = ecx

; _y$ = edx

push? esi

mov?? esi, ecx

mov?? eax, edx

sub?? esi, edx

sub?? eax, ecx

cmp?? ecx, edx

cmovge eax, esi

pop?? esi

ret?? 0

這樣,先分別計算出x - y 和 y - x, 然后通過cmp、cmovge來實現選擇。

Switch語句?

? ? ? ? ?Switch語句就是采用這種方式,如下例

????????

#include <stdio.h>
int main(int argc, char* argv[])
{	int  x = 3, y = -1,  z;char c;c = getch();switch (c) {case '+':case 'a': // 用 字符’a’來表示‘+’z = x + y;break;case '-':case 's': // 用 字符’s’來表示‘-’z = x - y;break;default: z = 0;}printf(" %d %c %d = %d \n", x,c,y,z);return 0;
}

可以看出,是通過幾種選擇的值與其中最小值的差作為偏移量從內存中取數,取出的數作為在一個數組取數的下標,取出的數就是跳轉到的地址,實際上就是用指令地址列表來實現的。

與轉移指令功能類似的指令?

? ? ? ? 帶條件的數據傳輸指令

? ? ? ? ? ? ? ? 上一篇詳細寫過。

語句格式:cmov***? r32,r32/m32

功??? 能:在條件“***”成立時,

????????? 傳送數據,即(r32/m32)→r32。

????????? cmov 是Conditional MOVe的縮寫。

要??? 求:

?? ① r32 表示一個32位的寄存器;

?? ② m32位表示一個內存地址;

????? m32對應直接、間接、變址、基址加變址尋址;

????? m32對應的單元的數據類型是雙字,即32位。

????????字節指令?

語句格式:set***? opd

功??? 能:在條件“***”成立時,(opd)??1,否則 (opd)? 0 。

????? opd 一般為 一個字節寄存器

如:

??? cmp?? eax,? ebx

??? setg? cl

??? seta? cl

??? sete? cl

使用單個標志位 設置

sete/setzsetcsetssetosetp

條件:ZF=1???? CF=1??? SF=1?? OF=1? PF=1?

setne/setnzsetncsetnssetnosetnp

條件:ZF=0???? CF=0????? SF=0??? OF=0?? PF=0

使用多個標志位組合設置

setasetbsetgsetl

setaesetbesetgesetle???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13892.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13892.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習500問——Chapter09:圖像分割(4)

文章目錄 9.10 Mask-RCNN 9.10.1 Mask-RCNN 的網絡結構示意圖 9.10.2 RCNN行人檢測框架 9.10.3 Mask-RCNN 技術要點 9.11 CNN在基于弱監督學習的圖像分割中的應用 9.11.1 Scribble 標記 9.11.2 圖像級別標記 9.11.3 DeepLabbounding boximage-level labels 9.11.4 統一的框架 9…

作為 App 開發者會推薦安裝的 Mac App

Xcode&#xff0c;作為 App 開發者&#xff0c;必須安裝的工具。當然&#xff0c;有經驗的開發者不會從 Mac App Store 下載&#xff0c;而是從網站下載&#xff0c;除了安裝過程更可控&#xff0c;也方便多版本共存。此外&#xff0c;我不信任任何第三方下載方式&#xff1a; …

表面簡單實則暗藏玄機的面試題:Java數組適合做隊列嗎?

Java數組本身是一種線性數據結構&#xff0c;它可以用來存儲一系列固定大小的元素。盡管數組可以用于實現隊列的一些基本操作&#xff0c;比如入隊&#xff08;enqueue&#xff09;和出隊&#xff08;dequeue&#xff09;&#xff0c;但由于其固定的大小&#xff0c;它并不適合…

開關電源重點可靠性測試項目與測試方法

為確保開關電源在復雜工作環境下的安全性與穩定性&#xff0c;各種安全性測試成為不可或缺的環節。本文將深入探討幾項關鍵的安全性測試項目&#xff0c;幫助用戶全面了解如何評估開關電源的可靠性和安全性。 一、過壓保護測試方法 目的是為了檢測當輸出電壓過高時&#xff0c;…

Unity限制鼠標光標位置

限制鼠標光標位置 private void Awake() {Cursor.lockState CursorLockMode.Confined;//Cursor.visible false;隱藏鼠標光標 }●Confined&#xff1a;限制光標到游戲窗口。 ●Locked&#xff1a;鎖定光標到游戲窗口的中心并隱藏。 ●None&#xff1a;不被修改。

項目9-網頁聊天室2(登錄)

0.前端知識儲備 Ajax請求中的async:false/true的作用 - front-gl - 博客園 (cnblogs.com) 01.前端頁面展示 02.后端代碼 2.1 CONTROLLER RequestMapping("/login")public Result login(String username, String password, HttpSession httpSession){User user …

鄉村振興與農村社會治理現代化:加強農村社會治理體系和治理能力現代化建設,提升鄉村治理效能,為美麗鄉村建設提供堅實保障

一、引言 在全面推進鄉村振興的偉大實踐中&#xff0c;農村社會治理現代化是不可或缺的重要一環。隨著時代的發展&#xff0c;傳統的農村社會治理方式已經無法滿足現代社會發展的需求。因此&#xff0c;加強農村社會治理體系和治理能力現代化建設&#xff0c;提升鄉村治理效能…

2024年電工杯數學建模競賽思路資料匯總貼

下文包含&#xff1a;2024電工杯&#xff08;電工杯數學建模競賽&#xff09;思路解析、電工杯參賽時間及規則信息說明、好用的數模技巧及如何備戰數學建模競賽 C君將會第一時間發布選題建議、所有題目的思路解析、相關代碼、參考文獻、參考論文等多項資料&#xff0c;幫助大家…

深度學習(文章鏈接匯總)

神經網絡與深度學習-簡要入門 動手學深度學習-pytorch版本&#xff08;一&#xff09;&#xff1a;引言 & 預備知識 動手學深度學習-pytorch版本&#xff08;二&#xff09;&#xff1a;線性神經網絡 YOLOv8 學習與環境配置

XSS漏洞

漏洞描述 XSS全名叫Cross Site Scripting(跨站腳本攻擊)因為簡寫和css同名所以改名為XSS&#xff0c;該漏洞主要利用javascript可以控制html&#xff0c;css&#xff0c;瀏覽器的行為從而惡意利用&#xff0c;當開發人員未對輸入的內容進行過濾或編碼時&#xff0c;惡意用戶在…

蒼穹外賣①

1.BeanUtils.copyProperties(orders,orderVO); BeanUtils.copyProperties 是 Java 中 Apache Commons BeanUtils 庫的一個方法&#xff0c;它用于將一個 Java Bean 的屬性復制到另一個 Java Bean。這個方法非常適合于對象之間的屬性復制&#xff0c;尤其是當源對象和目標對象的…

云服務器上部署Kubernetes集群(K8S)

master節點&#xff1a;master node節點&#xff1a;node1 由于是ubuntu系統&#xff0c;參考兩個博客配置 安裝vmware搭建k8s集群&#xff08;親試無坑&#xff09;-CSDN博客 該博客是centos系統&#xff0c;所以稍微有點區別結合另一篇博客一起參考 kubernetes集群…

scrapy進階(豆瓣新書速遞)(比亞迪)

scrapy數據建模與請求 學習目標&#xff1a; 應用 在scrapy項目中進行建模應用 構造Request對象&#xff0c;并發送請求應用 利用meta參數在不同的解析函數中傳遞數據scrapy構造post請求 1. 數據建模 通常在做項目的過程中&#xff0c;在items.py中進行數據建模 1.1 為什么建…

gt.qpa.xcb: could not connect to display : 1

報錯解釋&#xff1a; 這個錯誤通常發生在使用X11&#xff08;X Window System&#xff09;的Linux環境中&#xff0c;當嘗試啟動一個基于Qt平臺的應用程序時。錯誤信息表明程序無法連接到X服務器顯示設備&#xff0c;原因可能是沒有正確設置DISPLAY環境變量&#xff0c;或者用…

【Spring security】【pig】Note03-pig token令牌解析器過程

&#x1f338;&#x1f338; pig token令牌解析器過程 &#x1f338;&#x1f338; pig后端源碼 一、解析請求中的令牌值。 二、驗證令牌 內省并驗證給定的令牌&#xff0c;返回其屬性。返回映射表示令牌有效。 /*** author lengleng* date 2019/2/1 擴展用戶信息*/ publi…

Hot100-棧

20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean isValid(String s) {//用map的鍵值對匹配左右括號//按照順序&#xff0c;先匹配的是左括號&#xff0c;所以棧里面放左括號HashMap<Character, Character> rlationship new Has…

deepinlinuxv23b3用lazarus3.2開發生成2維碼

下載&#xff1a; https://sourceforge.net/projects/lazarus/files/ 最新版3.2.2的fpc,3.2的lazarus sourceforge默認下載慢&#xff0c;選擇auto-select能夠選擇近的鏡像站點&#xff0c;還不行的話也能夠motrix下載會自動更換域名 linux的qrencode安裝是 sudo apt…

跨境小白shopee被封號的原因?如何有效預防?

提到跨境電商平臺&#xff0c;大家都知道亞馬遜、Temu、TikTok shop這些是比較大的電商平臺。但最近幾年&#xff0c;在東南亞市場上&#xff0c;Shopee蝦皮卻是頗負盛名的一個跨境電商平臺&#xff0c;這也讓眾多中國跨境小白蜂擁而至。目前shopee的商家正在不斷增多&#xff…

[力扣題解] 130. 被圍繞的區域

題目&#xff1a;130. 被圍繞的區域 思路 代碼 Method 1 : 深度優先搜索&#xff0c;自己寫的 class Solution { private:int dir[4][2] {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};void dfs(vector<vector<char>>& board, vector<vector<bool>>&am…

vue3第三十四節(TS 之 interface 與 type 的異同)

1、interface 接口只能定義描述對象類型 如&#xff1a; interface PersonIn {name: string;age:number;job:string; }// 定義函數 interface FPerson {(a: number, b:string) > void }2、類型別名 type則可以定義多種類型 如&#xff1a; type userName string type…