x86架構下 CF與OF標志位 帶符號和無符號運算 詳解

針對能夠影響OF和CF標志位的指令,一般來說是涉及到數據運算的指令,這里使用add舉例,即不區分有無符號的加法指令,參與運算的數據,從二進制層級去考慮。

CF標志位

對于CF,它是carry flag,進位標志,這個進位,表示的是二進制層次下的進位,例如:

mov al,98h
add al,al

它的運算是
在這里插入圖片描述

其中,得到的最高一位,會被丟棄,這個也就是進位了!

模擬一下:
在這里插入圖片描述
這個進位還是很簡單的!

如何實現add指令進位時,CF的變化

這個簡單,我們只需要記錄一下add的結果的假想最高位即可,就是加法器的進位位。

功能層級理解CF & 進位借位

其實我們只需要從功能角度去理解就可以了,不用關注具體如何實現的,因為這可能非常復雜,不過你的確可以簡單思考一下。

CF不僅僅記錄add時候的進位,也記錄sub時候的借位,同時如何想使用這個進位或者借位,還有sbbadd等指令。
在這里插入圖片描述
考慮借位的時候,只需要CF的結果等于加法器進位異或sub即可。

OF標志位

overflow flag,溢出標志位,它記錄的不是二進制下的進位,而是十進制下的不合理結果,例如

  • 正數 + 正數 = 負數
  • 負數 + 負數 = 正數
  • ……

我們舉個例子,分別從二進制和十進制下看待這個問題

mov al,98
add al,99
  • 從十進制角度,98 + 99 = 197,但是對于8位補碼,數據范圍是-128 - 127,197是不合理的,它溢出了,因此OF 置 1
  • 從二進制角度,98 + 99 = 62h + 63h = c5h,我們可以看到,單從計算機世界來說,兩數相加,結果并沒有進位,因此CF = 0

我們可以看到,從二進制世界來說,可以很容易識別出進位,但是不容易識別出溢出,因為溢出的規則,是由人類世界的十進制法則決定的,要想實現識別,應該單獨設定一些其他邏輯。

因此,我們要聯合人類世界和計算機世界,來思考如何實現OF標志位的邏輯。

OF標志置位復位的實現

我們先考慮一下可能溢出的場景(8位二進制補碼真值范圍 -128 ~ 127)

  • 負數 + 負數 = 正數
  • 正數 + 正數 = 負數
  • 其他…

我們就先假定至于這兩種場景吧,那么如何實現OF的邏輯?很簡單,列真值表!

我們規定輸入

  • 操作數1為正數記為0,負數記為1(其實就是最高位)
  • 運算:加法為0,減法為1
  • 操作數2為正數記為0,負數記為1
  • 運算結果為正數記為0,負數記為1

輸出OF

操作數1操作操作數2運算結果OF
10101
00011
0
1

這樣我們就能夠根據真值表,得到一個組合邏輯,實現OF了。

當然這只是一個思路而已,舉這個例子是為了說明,OF的實現是與十進制運算密切相關的,僅依靠二進制看不出來

CF與OF分開看

我們前面可以知道,CF有CF的實現邏輯,OF有OF的實現邏輯,實際執行add運算的時候,我們根據

  • 操作數1
  • add運算
  • 操作數2
  • 運算結果

這幾個因素,來分別生成OF和CF的結果,二者在機器層級上是相互獨立并行工作的兩個組合邏輯

也就是說,CF與OF的組合可能是

  • 00
  • 01
  • 10
  • 11

并且二者沒有什么關聯。

CF、OF與有無符號(整)數運算的關系

注意暫時不談浮點數!

首先,有無符號是從高級語言層級才能看出來add指令進行加法運算,不區分有無符號,不管高級語言是有符號加還是無符號加,都是add指令,結果完全一樣,因此,僅憑借add指令是無法區分的

那如何區分呢?依靠其他指令以及CF、OF標志位

通常來說

  • CF用于識別無符號數運算的溢出,因為無符號數運算溢出,等價于二進制運算進位了
  • OF用于識別帶符號數運算的溢出,這個邏輯的設置,本身就針對帶符號數,沒什么好說的,補碼就針對帶符號數

這里再強調人類世界與計算機世界關于整數的轉換規則

  • 帶符號數:補碼
  • 無符號數:二進制位串

運算與標志位的關系

  • 無含義的純結果:對于sub,add這種不區分有無符號運算的指令,標志位的結果只和運算結果有關,也不需要分開看。

  • 根據其他指令識別標志位,給結果賦予含義:但是如果我們去利用標志位做識別,就需要進行分開看,不同的標志位識別,決定了這個運算結果的不同含義,決定了它是帶符號數還是無符號數運算,亦或者是比較運算。

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

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

相關文章

tmux學習筆記

參考學習鏈接 我們需要理解幾個重要的概念 session 回話window 窗口pane 窗格 window 我們打開的一個terminal就是一個window. 而打開的這個window,也就是打開了一個session,打開window,session開始;關閉window,se…

安裝win10和Linux雙系統的個人經驗

使用easy uefi誤刪除win10引導文件 這個時候,網上教程有各種方式,我直接使用了一種最簡單的,這個方法網上都沒有提到過。 注意:發現引導文件刪了,千萬不要關機,否則再想開機恐怕只能重裝系統了。 我們直…

Linux的ext4文件系統學習筆記

補充:設備獨立性 Linux中,設備驅動以文件形式表示,用戶操作邏輯設備就是操作文件,而不是具體的物理設備,也就是說,用戶操作的是功能,是黑箱,而不是真正的實體。 APP操作的都是邏輯…

html基礎元素案例筆記(1)

這是代碼 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS FlexBox test</title><link rel"stylesheet" type"text/css" href"./css/index.css"></head><body>…

C語言中的struct和union區別

參考&#xff1a;Difference between Structure and Union in C 二者區別 struct 這里不做詳細說明&#xff0c;因為參考鏈接中都寫明了。只做一些重點強調。 struct中聲明的變量&#xff0c;在分配空間的時候&#xff0c;struct結構空間大小&#xff0c;大于等于其內部所有…

C語言多文件編譯鏈接為1個可執行文件的簡單原理

參考1&#xff1a;C header files and compilation/linking 參考2&#xff1a;計算機系統基礎&#xff08;一&#xff09;袁春風 &#xff08;符號鏈接部分&#xff09; 我們現在有一個簡單的工程&#xff0c;有這么幾個文件 1.t1.h extern int x;void tt();t1.c #include &…

Java讀寫二維數組到文件

1. 創建文件 使用了File類中的createrNewFile方法。 public static boolean createFile(String filename){try{File file new File(filename);file.createNewFile();return true;} catch (IOException e) {e.printStackTrace();return false;}}查閱文檔可知&#xff0c;若文件…

如何掌握java API的方法

如何掌握方法的使用&#xff1f; 查文檔文檔不一定看得懂&#xff0c;親自試一試就知道了&#xff01; 這倆方法沒啥好說的&#xff0c;自己體會即可&#xff01; 注意&#xff01;先看原版英文文檔&#xff0c;然后自己試一試&#xff0c;就能更加理解了&#xff0c;然后&a…

Leetcode1512. 好數對的數目 抽出本質原型 利用范圍條件

解法1&#xff1a;暴力枚舉 class Solution {public int numIdenticalPairs(int[] nums) {int count 0;for(int i 0;i < nums.length; i){for(int j i 1; j < nums.length; j){if(nums[i] nums[j])count;}}return count;} }沒啥可說的&#xff0c;就是小學數學問題…

leetcode面試題 10.01. 合并排序的數組

直接排序 直接使用Java已有的方法進行排序&#xff0c;這一招…大意了&#xff01; 這題簡單&#xff0c;就是個基本的排序&#xff0c;后面難題&#xff0c;可能這只是一小步&#xff0c;內個時候直接用排序算法比較合適&#xff0c;這個不合適。。 class Solution {public…

IA-32 Architecture: the function of segment regitster(CS DS SS ES)

對于IA-32架構&#xff0c;與8086不同&#xff0c;段寄存器不再是像以前一樣&#xff0c;直接作為段基址&#xff0c;因為32位的寄存器直接就可以表示4GB大小&#xff0c;不需要再偏移&#xff0c;因此段寄存器的含義也發生了相應的變化。 在IA-32架構里&#xff0c;段寄存器是…

x86異常處理與中斷機制(1)概述中斷的來源和處理方式

參考《計算機組成》&#xff08;北京大學 MOOC&#xff09; 1 異常與中斷的來源&#xff08;為什么需要中斷&#xff09; 首先&#xff0c;說明一下異常和中斷這兩個概念。 它們兩個唯一的區別&#xff0c;就是&#xff0c;沒有什么區別。只是不同的地方不同的時間不同的人的…

【C language】typedef的使用:結構體、基本數據類型、數組

typedef基本數據類型 typedef int a; a abc;后面的a abc就等價于int abc typedef結構體 typedef struct a {int a;int b; } abc;abc aaa;對于上述&#xff0c;abc aaa;就等價于struct a aaa; 簡而言之&#xff0c;typedef的本質&#xff0c;就是構建等價關系。 第一個例…

【C language】動態數組的創建和使用

在C語言中&#xff0c;使用malloc函數創建動態數組&#xff0c;使用一個指針指向它&#xff0c;使用下標進行訪問。 unsigned long *a (unsigned long *)malloc(2 * sizeof(int)); a[0] 1000; a[1] 2000; printf("%d %d\n", a[0], a[1]); free(a);上述例子&…

x86異常處理與中斷機制(2)中斷向量表

補充&#xff1a;事件不僅包含中斷和異常&#xff0c;還包含系統調用&#xff0c;這個屬于用戶主動請求的事件。 上一節&#xff0c;只有一個溢出異常&#xff0c;那么&#xff0c;如果很多異常、中斷呢&#xff1f;&#xff08;中斷向量表&#xff09; 另外&#xff0c;之前0…

x86異常處理與中斷機制(3)中斷處理過程

上一節講完了根據中斷類型號找中斷服務程序的過程&#xff0c;現在著重說明一下更加完整的中斷處理過程吧。 本節以8086時代的中斷處理過程為例進行說明&#xff0c;主要分兩大部分 硬件處理軟件處理 需要注意&#xff0c;這不是絕對的&#xff0c;得看實際情況&#xff0c;…

Linux 0.11 內核解析:中斷相關(1)asm.s文件中斷處理分析

0 源代碼 有兩個版本的&#xff0c;一個是帶中文注釋&#xff0c;Intel格式的&#xff1b;一個是不帶注釋是AT&T格式的。 Linux 0.11 中文注釋版 Linux 0.11 源碼&#xff0c;基于《Linux內核完全注釋》趙炯 1 asm.s 文件 我們先假設該文件處理的中斷是無特權過渡的情況…

【精華文】C語言結構體特殊情況分析:結構體指針 / 基本數據類型指針,指向其他結構體

參考鏈接&#xff1a;Structure pointer pointing to different structure instance 注&#xff1a;可以查看此篇的問題和唯一的回復&#xff0c;那是相對正確的&#xff0c;不要看comment&#xff0c;有很多錯誤。 我是拒絕分析這種問題的&#xff0c;因為似乎沒有人會這么亂用…

enum in c language

今天說說C語言中的枚舉。 參考&#xff1a;Enumeration (or enum) in C 1 定義 定義一個枚舉類型很容易&#xff1a; enum aa { a1, a2, a3 };這里 enum是關鍵字aa是枚舉變量&#xff0c;也就是我們自定義類型a1,a2,a3是枚舉成員 然后怎么使用呢&#xff1f; 首先&#…

信號量SIGCHLD的使用,如何讓父進程得知子進程執行結束,如何讓父進程區分多個子進程的結束

本教程基于 Ubuntu 20.10 gcc 10.2.0. 示例程序如果不能正常編譯和執行&#xff0c;說明您系統和工具版本與我的不匹配&#xff0c;請自行查閱資料。 0 概述 先給出該信號的描述&#xff1a; SignalValueDescriptionSIGCHLD17Child status has changed (POSIX). Signal sent …