【匯編語言】乘法(MUL/IMUL)

乘法(MUL/IMUL)

目錄

      • 乘法(MUL/IMUL)
        • `IMUL`(signed multiply)有符號數乘法
        • `MUL`(unsigned multiply)無符號數乘法

麻!屬實是被這個有符號乘法給整麻了,教材就一行例子直接不解釋了,關于標志位溢出的一概不談,屁用沒有。然后去網上查了查好像說明白了但又沒完全明白,以至于我剛剛才明白

先說這有符號乘法!

IMUL(signed multiply)有符號數乘法

格式:MUL SRC

操作:

  • 當操作數為字節時,(AX)←(AL)×(SRC)(AX)\gets (AL)\times (SRC)(AX)(AL)×(SRC)
  • 當操作數為字時,(DX,AX)←(AX)×(SRC)(DX, AX)\gets (AX)\times(SRC)(DX,AX)(AX)×(SRC)

標志位響應:

  • 當乘積的高半部分是低半部分的符號擴展時,表示未溢出,OF=CF=0OF=CF=0OF=CF=0
  • 當乘積的高半部分不是低半部分的符號擴展時,表示溢出,OF=CF=1OF=CF=1OF=CF=1

符號擴展

微機系統中,有時需要將一個數據從位數較少擴展到位數較多,例如,在執行除法指令時,由于對字節除數相除要求被除數為16位,對字除數要求被除數為32位,即被除數必須為除數的倍長數據,因此就涉及數據的位數擴展問題,具體的擴展有符號擴展與零擴展兩種方法

  1. 當要擴展的數據是無符號數時可采用零擴展。即在最高位前擴展0,補充夠位數即可
  2. 當要擴展的數據是有符號數時需采用符號擴展。由于采用補碼形式表示的整數具有固定的長度,因此在匯編指令系統中,經常有一些指令需要將其中的操作數進行符號位擴展。譬如兩個8位或16位數據進行相加或者相減運算時,當有不足位數要求的數據時,需要將少位數據擴展成與位數要求相一致的數據;兩個數據相除時,被除數應必須是除數的倍數等。 符號擴展的方法是將需要擴展的數據的符號位填入到擴展的每一位,以保持其作為有符號數的值的大小不變。這里要注意,要擴展的數須是用補碼形式表示的有符號數,符號擴展后。其結果仍是該數的補碼。 因此,對于補碼表示的數,其正數的符號擴展是將其符號位0向左擴展(補0);其負數的符號擴展是將其符號位1向左擴展(補1)

有符號數相乘的步驟

  1. 符號位擴展,將兩個乘數都擴展至原來的兩倍大(例如,字節數據100011011000\ 11011000?1101擴展為字數據11111111100011011111\ 1111\ 1000\ 11011111?1111?1000?1101
  2. 擴展后的數據相乘
  3. 取有效位(即為原乘數位數的兩倍)

舉例:

F1H×F1HF1H\times F1HF1H×F1H(?15)×(?15)=(+225)(-15)\times (-15)=(+225)(?15)×(?15)=(+225)

  1. 符號位擴展
    11110001→11111111111100011111\ 0001\to {\color{Blue} 1111\ 1111} \ 1111\ 00011111?00011111?1111?1111?0001

  2. 擴展后的數據相乘
    1111111111110001×111111111111000111111111111000100000000011100001\begin{array}{r} {\color{Blue} 1111\ 1111} \ 1111\ 0001\\ \times {\color{Blue} 1111\ 1111} \ 1111\ 0001\\ \hline {\color{Gray} 1111\ 1111\ 1110\ 0010} \ 0000\ 0000\ 1110\ 0001 \end{array}1111?1111?1111?0001×1111?1111?1111?00011111?1111?1110?0010?0000?0000?1110?0001??

  3. 取有效位
    保留低16位有效位00000000111000010000\ 0000\ 1110\ 00010000?0000?1110?0001
    AH=00HAH=00HAH=00HAL=E1HAL=E1HAL=E1H

  4. 判斷標志位響應
    由于AHAHAH并不是ALALAL的符號擴展
    0000000011100001{\color{Green} 0000\ 0000} \ {\color{Red} 1} 110\ 00010000?0000?1110?0001
    AHAHAH全為0,而ALALAL最高位(符號位)為1,因此溢出OF=CF=1OF=CF=1OF=CF=1

    有符號數乘積的高半部分只起到表示符號的作用,溢出時,其是無效的信息可不關注,因此對于8位有符號數相乘不溢出的結果范圍即為?128-128?128 ~ +127+127+127,這里低8位最高位為1表示結果為負數,而兩乘數均為負數,結果應為正數,故產生了溢出

  5. debug測試
    在這里插入圖片描述

24H×FDH24H\times FDH24H×FDH(+36)×(?3)=(?108)(+36)\times (-3)=(-108)(+36)×(?3)=(?108)

0000000000100100×111111111111110100000000001000111111111110010100\begin{array}{r} {\color{Blue} 0000\ 0000} \ 0010\ 0100\\ \times {\color{Blue} 1111\ 1111} \ 1111\ 1101\\ \hline {\color{Gray} 0000\ 0000\ 0010\ 0011} \ {\color{Green} 1111\ 1111\ 1} 001\ 0100 \end{array}0000?0000?0010?0100×1111?1111?1111?11010000?0000?0010?0011?1111?1111?1001?0100??

這里高半部分是低半部分的符號擴展,因此未溢出,OF=CF=0OF=CF=0OF=CF=0,這里結果100101001001\ 01001001?0100即為?108-108?108的補碼形式

在這里插入圖片描述

MUL(unsigned multiply)無符號數乘法

格式與操作與IMUL相同,用來作無符號數乘法

標志位響應:

  • 當乘積的高半部分不為0時,表示溢出,CF=OF=1CF=OF=1CF=OF=1
  • 當乘積的高半部分為0時,表示未溢出,CF=OF=0CF=OF=0CF=OF=0

很簡單就直接乘,乘就完事了!直接上例子(和有符號的第一個例子數據相同,看其對比)

舉例:

F1H×F1HF1H\times F1HF1H×F1H241×241=58081241\times 241=58081241×241=58081

11110001×111100011110001011100001\begin{array}{r} 1111\ 0001\\ \times 1111\ 0001\\ \hline 1110\ 0010\ 1110\ 0001 \end{array}1111?0001×1111?00011110?0010?1110?0001??

顯然這里高半部分不為0,故溢出CF=OF=1CF=OF=1CF=OF=1

在這里插入圖片描述

這里的溢出和有符號的溢出都是針對于低半部分范圍而言的,即對于無符號數的乘積不溢出的范圍則是000 ~ 255255255,但是由于高半部分的數據由AXAXAX的高半部分AHAHAH存儲,故雖說是“溢出”但是其總的結果是正確的、有效的;而對于有符號乘積,其AHAHAH存的只是符號擴展信息,當發生溢出時,則代表該結果是錯誤的

另外,無符號數相乘結果總是正確的,因為最大的乘積也不會超越其乘數位數的兩倍可表示的范圍

11111111×111111111111111000000001\begin{array}{r} 1111\ 1111\\ \times 1111\ 1111\\ \hline 1111\ 1110\ 0000\ 0001 \end{array}1111?1111×1111?11111111?1110?0000?0001??

FFH×FFH=FE01HFFH\times FFH=FE01HFFH×FFH=FE01H

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

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

相關文章

【轉】MFC學習總結

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if ((pWnd->GetDlgCtrlID() IDC_EDIT1) && (nCtlColor CTLCOLOR_EDIT)) {   COLORREF clr RGB(255,0,0);   pDC->SetTextColor(clr);  //設置紅色的文本   clr RGB(0,0,0…

NHibernate初學體驗進階篇

在上篇《NHibernate初學體檢記》中&#xff0c;我參照NHibernate官方快速指南寫了兩個示例項目&#xff0c;在示例2的源碼中充斥了如下類似的代碼&#xff1a;<?XML:NAMESPACE PREFIX O />Configuration cfg new Configuration(); cfg.AddAssembly("…

eclipse快捷鍵

Java開發工具(Eclipse的視窗和視圖概述) A:視窗 每一個基本的窗體被稱為視窗 PackageExplorer 顯示項目結構&#xff0c;包&#xff0c;類&#xff0c;及資源Outline 顯示類的結構&#xff0c;方便查找&#xff0c;識別&#xff0c;修改Console 程序運行的結果在該窗口顯示Hie…

【匯編語言】除法(DIV/IDIV)

除法&#xff08;DIV/IDIV&#xff09; 目錄除法&#xff08;DIV/IDIV&#xff09;DIV(unsigned divide)無符號數除法IDIV(signed divide)有符號數除法DIV(unsigned divide)無符號數除法 格式&#xff1a;DIV SRC 操作&#xff1a; SRCSRCSRC為字節時&#xff0c;(AL)←(AX)/…

java 方法 示例_Java集合syncedSortedSet()方法與示例

java 方法 示例集合類SynchronizedSortedSet()方法 (Collections Class synchronizedSortedSet() method) synchronizedSortedSet() method is available in java.util package. java.util軟件包中提供了sharedSortedSet ()方法 。 synchronizedSortedSet() method is used to …

遠控免殺專題(17)-Python-Rootkit免殺

免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全家桶…

項目管理軟件應用淺析(轉)

項目管理是在一定的約束條件下&#xff0c;以高效率地實現項目業主的目標為目的&#xff0c;以項目經理個人負責制為基礎和以項目為獨立實體進行經濟核算&#xff0c;并按照項目內在的邏輯規律進行有效的計劃、組織、協調、控制的系統管理活動。項目管理的核心技術是網絡計劃技…

斜視角的討論(轉)

http://school.ogdev.net/listshow.asp?page4&typeid0&categoryid5&id0&ListType2 目 錄 1.1 地圖和地表 1.2 斜視角游戲中的視角 1.3 Tile圖片的拼接 1.4 不同地表間的過渡 1.5 地圖數據結構的定義 --------------------------------------------------…

計算機網絡(湖科大教書匠)

計算機網絡&#xff08;湖科大教書匠&#xff09; 本文檔為教學視頻【計算機網絡微課堂&#xff08;有字幕無背景音樂版&#xff09;_嗶哩嗶哩_bilibili】的摘錄 目錄計算機網絡&#xff08;湖科大教書匠&#xff09;一、緒論1.2 因特網概述1.2.1 網絡、互連網&#xff08;互聯…

經緯度

題目描述 給定地球的兩個經緯度坐標&#xff0c;問這兩個點的直線距離。假設地球為球體&#xff0c;半徑為6371009米。 輸入描述: 第一行一個整數T表示數據組數。 接下來n行&#xff0c;每行四個數lat1, lng1, lat2, lng2分別表示兩個點的經緯度。 正數表示北緯和東經。 …

遠控免殺專題(18)-ASWCrypter免殺

免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全家桶…

Hibernate 筆記4 實現對數據庫的增刪改查

1 準備 首先在mysql數據庫中建表User,并添加相關信息。 user表結構如下。 ---------------------------------------------------------| Field | Type | Null | Key | Default | Extra |------------------------------------------------…

Direct3D中的繪制(3)

立方體——只比三角形稍微復雜一點&#xff0c;這個程序渲染一個線框立方體。 這個簡單的繪制和渲染立方體的程序的運行結果如下圖所示&#xff1a; 源程序&#xff1a; /************************************************************************************** Renders a …

遠控免殺專題(19)-nps_payload免殺

免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全家桶…

VS2005中使用WebDeploymentProject的問題

近來做Web項目&#xff0c;VS2005中發布網站時默認發布大批的程序集&#xff0c;這給升級網站時造成很大麻煩&#xff0c;所以偶從MS下載了個WebDeploymentProject的插件&#xff08;下載地址http://download.microsoft.com/download/c/c/b/ccb4877f-55f7-4478-8f16-e41886607a…

操作系統中的多級隊列調度

多級隊列調度 (Multilevel queue scheduling) Every algorithm supports a different class of process but in a generalized system, some process wants to be scheduled using a priority algorithm. While some process wants to remain in the system (interactive proce…

編寫一程序,輸入一個字符串,查找該字符串中是否包含“abc”。

import java.lang.String.*;//這里調用java.long.String.contains()方法&#xff1b; import java.util.Scanner; public class shit {public static void main(String[] args) {Scanner wsq new Scanner(System.in);String str wsq.next();boolean status str.contains(&qu…

顯示消息提示對話框(WebForm)

1: /// <summary>2: /// 顯示消息提示對話框。3: /// Copyright (C) Maticsoft4: /// </summary>5: public class MessageBox6: { 7: private MessageBox()8: { 9: }10: 11: …

借助格式化輸出過canary保護

0x01 canary保護機制 棧溢出保護是一種緩沖區溢出攻擊緩解手段&#xff0c;當函數存在緩沖區溢出攻擊漏洞時&#xff0c;攻擊者可以覆蓋棧上的返回地址來讓shellcode能夠得到執行。當啟用棧保護后&#xff0c;函數開始執行的時候會先往棧里插入cookie信息&#xff0c;當函數真…

什么叫灰度圖

任何顏色都有紅、綠、藍三原色組成&#xff0c;假如原來某點的顏色為RGB(R&#xff0c;G&#xff0c;B)&#xff0c;那么&#xff0c;我們可以通過下面幾種方法&#xff0c;將其轉換為灰度&#xff1a; 1.浮點算法&#xff1a;GrayR*0.3G*0.59B*0.11 2.整數方法&#xff1a;Gra…