【匯編語言】數據類型的匹配問題:自動匹配與手動匹配

0 前言

本文基于8086匯編語言,不過x86系列語言具備向下兼容特點,大多數情況都可以用。

與高級語言數據類型的自動轉換強制轉換一樣,匯編語言的數據類型也有 自動匹配手動匹配

下面,我來介紹一下匯編語言的相關原則。

1 數據類型匹配的原則

任何時候,數據的匹配,只能是完全一樣的數據類型才能進行數據傳送。

也就是8位對8位,16位對16位,32位對32位。

比如

  1. mov ax,bx
  2. mov al,bl

請注意,這里的原則與操作數個數無關,指令如果涉及到數據傳送過程,至少也要有數據提供方,有數據接收方

在這里插入圖片描述
需要注意,這里的數據傳送,是copy,而不是remove,傳送之后原來的數據不消失,只是復制過去。

你想問為什么是copy?先明白一個問題,計算機的本質,是電子計算機,是基于電的。你可以想象一下,有兩根導線,中間有一個沒有閉合的開關,開關閉合前,左邊的是導線通電的,右邊的不帶電,現在將開關閉合,右邊的導線是不是也通電了,左邊的導線沒有因此不帶電吧?開關閉合后通電的過程,就是數據傳送的過程,我想你大概能理解為什么是copy了。

2 自動匹配

由上面的圖你可以看到,有三個部分

  • 數據提供方A
  • 數據傳送帶B
  • 數據接收方C

自動匹配分為以下情況

  • B大小固定:則A,C的大小自動固定
    • 例如:指令push,pop要求必須是字傳送,也就是B的大小限定為16
    • ……
  • B大小不固定:則A,C只要有一方是固定,另一方自動固定
    • 例如:mov ax,1,因為ax固定16位,則1也要是16位,如果不是,需要變成16位的(插一句,這就是符號擴展
    • mov ax,bx,雙方都固定16位也是可以的

對于B固定的情況,只有很少一部分,記住即可,這里談一下不固定的部分。

A,C分別代表數據的提供方和接收方,它們不一定是兩個操作數,也可能是隱藏的,例如有的指令是單操作數,有的沒有操作數,但這都不妨礙它們都有A和C

A或C可能是

  • 寄存器
  • 內存單元

當一方為寄存器,例如使用ax,則另一方就需要是16位的數據,可以是

  • 寄存器,例如bx
  • 定義為dw類型的數據
  • 某個數據的首地址,自動按16位提取,不需要加限制條件,例如ds:[0]
  • 立即數,自動擴展為16位的

當一方為dw類型數據,也是同理。

不可以的情況:當一方為內存單元地址,另外一方為立即數,例如mov ds:[0],1,這就是手動匹配,看下一節。

3 手動匹配

A和C的大小都不能確定的時候,就需要手動匹配,加上限定條件了,這通常發生在<內存單元地址>立即數身上,因為它們是不固定大小的,如果它們結合,或者單獨出現,就必須加上限制條件。

例如

  • mov word ptr ds:[0],1
  • jmp word ptr ds:[0]

只能對內存單元地址做出規定,也就是word ptrbyte ptrdword ptr等,立即數是墻頭草,別人多大他多大。

4 注意事項

需要注意的是,對于數據類型匹配這件事情,取決于編譯器和CPU的設計者,大多數情況是遵循我上面所說的原則的,對于極少數特殊情況,也是完全可能的,不要因此感到驚訝。

5 小結

前面解釋了很多,不過你根本沒有必要記憶,只需要警惕一些特殊情況即可

對于沒有限定B部分的指令

  1. 雙操作數指令,出現內存單元地址和立即數,地址要限定word ptr等類型
  2. 單操作數,內存單元地址要限定類型
    在這里插入圖片描述

就像賽跑,規定了起點位置和長度,就能夠得到終點位置

  • 起點位置就是內存單元地址,比如ds:[0]代表起點位置為ds*16 + 0
  • 長度就是數據類型,比如word ptr代表長度2個字節

對于其他指令集架構,原理上是有相通性的,請讀者自行思考。

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

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

相關文章

生產者消費者模型(條件變量+互斥鎖)

生產者消費者模型 線程同步典型的案例即為生產者消費者模型&#xff0c;而借助條件變量來實現這一模型&#xff0c;是比較常見的一種方法。假定有兩個線程&#xff0c;一個模擬生產者行為&#xff0c;一個模擬消費者行為。兩個線程同時操作一個共享資源&#xff0c;生產者向其…

【匯編語言】王爽實驗8,分析一個奇怪的程序,學習筆記(20200517)

0 前言 先給出源程序 assume cs:code code segmentmov ax,4c00hint 21hstart:mov ax,0s:nopnopmov di,offset smov si,offset s2mov ax,cs:[si]mov cs:[di],axs0:jmp short ss1:mov ax,0int 21hmov ax,0s2:jmp short s1nopcode ends end start運行結果&#xff1a;本程序能夠…

Qt制作定時關機小程序

文章目錄 完成效果圖ui界面ui樣圖 main函數窗口文件頭文件cpp文件 引言 一般定時關機采用命令行模式&#xff0c;還需要我們計算在多久后關機&#xff0c;我們可以做一個小程序來定時關機 完成效果圖 ui界面 <?xml version"1.0" encoding"UTF-8"?>…

MIPS快速入門(原文+翻譯):MIPS Architecture and Assembly Language Overview(持續更新中)

前言 發布該文章的網站已經無法訪問&#xff0c;無法獲得相關翻譯授權&#xff0c;本人的翻譯僅供大家參考學習&#xff0c;盡可能使用直譯&#xff0c;并加上一些譯者注&#xff08;使用“ [1] ”的形式&#xff09;&#xff0c;以減少信息損失&#xff0c;水平有限&#xff…

Visual Studio 編譯優化選項:Debug與Release、禁止優化與O1、O2、Ox優化

Debug與禁止優化 Debug模式是調試模式&#xff0c;會有很多冗余的調試代碼&#xff0c;供開發者調試程序使用。 VS是默認使用Debug模式的&#xff0c;我使用的是VS 2017。 在Debug模式下&#xff0c;是默認開啟禁止優化的&#xff0c;我們來查看一下 在左側源文件的main.c處…

【匯編語言】記錄一組數中負數的個數,8086與MIPS匯編程序

題目及解答 統計由DATA開始的字節數據串中負元素的個數&#xff0c;數據個數在COUNT單元&#xff0c;統計結果存入RLT單元。 8086匯編&#xff1a; ; 統計數字中負數的個數【循環中加了個if else】 assume ds:datasg datasg segmentdata db 1,-2,-3,-1,-4,0,-2 count dw 7 ; 數…

【數字邏輯入門】計算機如何存儲1位二進制數

0 前言 本文將會以R-S鎖存器為例&#xff0c;引出鎖存器的核心和本質&#xff0c;之后再帶你構建更多類型的鎖存器&#xff0c;你能夠&#xff1a; 感受到由淺入深的學習方式體會到掌握核心本質的快感深刻理解核心套外殼的設計理念&#xff08;產品迭代1.0–>2.0–>3.0…

【算法訓練】DAY1:整數反轉

1 前言 題目來源于Leetcode。 重點&#xff1a;理清邏輯&#xff0c;忽略細節&#xff0c;模仿高手&#xff0c;五毒神掌 2 題目分析 題目很容易理解&#xff0c;先分成兩個部分 正數負數 先解決正數 最開始想到的是 intchar數組long唯一增加的就是&#xff0c;先判斷整…

【匯編語言】(x86)test與跳轉指令(je jle jge jg jl……)組合的含義

在x86指令集中&#xff0c;經常遇到test指令與條件跳轉指令組合&#xff0c;這是什么含義呢&#xff1f; 博主表示&#xff0c;查了很多資料也沒人完全說清楚…… 這里只用最簡單的&#xff0c;抽象層次進行說明&#xff0c;不講原理。 舉例 test edx,edx jle 某地址含義是&…

【藍橋杯】BASIC-8 回文數(2020-06-08)

題目 試題 基礎練習 回文數 資源限制 時間限制&#xff1a;1.0s 內存限制&#xff1a;512.0MB 問題描述   1221是一個非常特殊的數&#xff0c;它從左邊讀和從右邊讀是一樣的&#xff0c;編程求所有這樣的四位十進制數。    輸出格式   按從小到大的順序輸出滿足條件的…

【算法訓練】Leetcode 1295. 統計位數為偶數的數字(2020.06.09 )

1 題目 1295. 統計位數為偶數的數字 給你一個整數數組 nums&#xff0c;請你返回其中位數為 偶數 的數字的個數。 示例 1&#xff1a; 輸入&#xff1a;nums [12,345,2,6,7896] 輸出&#xff1a;2 解釋&#xff1a; 12 是 2 位數字&#xff08;位數為偶數&#xff09; 345 …

Vivado設置指定源文件進行RTL優化

像VS編譯器設置啟動項一樣&#xff0c;Vivado中&#xff0c;也有類似設計&#xff0c;可以看到&#xff0c;當前選中的是ALU&#xff0c;那么進行RTL優化的時候&#xff0c;會優化RTL的結果&#xff0c;而不是別的&#xff0c;如何改成別的&#xff1f; 在某文件上右鍵單擊選擇…

【完整流程】用VSCode替換Vivado默認編輯器

本文樓主找了很多資料&#xff0c;選出了最有用的資料&#xff0c;按照教程走&#xff0c;就可以順利搞定&#xff0c;先給出畫面 很酷很方便&#xff0c;同時還有 自動補全檢測錯誤列選自動生成仿真測試文件 等重要功能 Vivado原來的編輯器是這樣的…… 關鍵是&#xff0c…

IEDA中JavaDoc的自動生成、手動生成,以及生成html文檔

1 自動生成類的注釋 JavaDoc就是java特有的一種注釋。 1.1 配置 首先&#xff0c;IDEA點擊File-->Settings 然后Editor-->File and Code Templates-->Class 之后在這地方&#xff0c;添加一些代碼 /** * ${description} * * <p> * 創建日期&#xff1a;$…

【java】父類與子類的引用賦值關系

理清楚4個目標 父類引用&#xff08;“名”&#xff09;父類對象&#xff08;“實”&#xff09;子類引用子類對象 理清楚幾個操作 // 父類 public class parent{}// 子類 public class sun{}父類引用指向父類對象 parent p1 new parent();子類引用指向子類對象 son s1 …

IDEA自動生成 構造方法 get set方法

對于一個類&#xff0c;創建好成員變量后 右鍵單擊&#xff0c;選中Generate 然后 這幾個依次是 構造方法getsetget和set 我們可以選中一個&#xff0c;然后選中要生成的變量&#xff0c;點擊OK 這樣就可以自動生成 構成方法get方法set方法

IDEA快速修改類名和文件名

在你要修改的類名上&#xff0c;選中類名&#xff0c;然后 右鍵單擊選中Refactor選中Rename 也可以使用快捷鍵 Win用戶是Shift F6

java中 靜態方法與成員方法何時使用

靜態方法 不操作成員變量&#xff0c;可以直接調用 是用來直接對傳入的數據進行操作的 成員方法 需要操作對象的成員變量的 區別 靜態方法&#xff0c;不能操作成員變量&#xff0c;只是一個操作成員方法&#xff0c;可以操作成員變量&#xff0c;不僅僅是操作&#xff0…

通過編程解決問題的正確思路

1. 先知道我們面對一個怎樣的問題 2. 考慮這個問題在現實生活中&#xff0c;我們要用怎樣的方式去解決 3. 從現實到計算機&#xff0c;如何用編程的思路解決 4. 實現&#xff0c;編碼和測試 5. 迭代 現實問題自然語言解決方案機器語言解決方案編碼實現測試迭代

數據庫設計的核心原則 外鍵的設計 提高插入數據速度

大道至簡&#xff1a;數據庫設計的核心原則 數據庫設計&#xff0c;不得不承認&#xff0c;有很多專業化的理論知識&#xff0c;但是對于初學者來說&#xff0c;只需要大道至簡的原則就可以了。 能不重復的就不重復&#xff0c;太重復的就拆開&#xff0c;使用指定數據做識別…