【匯編語言】8086匯編字符串定義為何使用DB?其他數據類型不可以嗎?(20200515復盤)

目錄

  • 0 前言
    • 0.1 先告訴你結論
  • 1 8086匯編語言中的字符串
    • 1.1 字符串的定義與使用
    • 1.2 直接定義的細節
      • 1.2.1 使用DB數據類型
      • 1.2.2 使用其他數據類型
    • 1.3 直接使用的細節
      • 1.3.1 賦值給寄存器
      • 1.3.2 賦值給內存單元
      • 1.3.3 字符串直接使用的本質
    • 1.4 應用
  • 2 擴展:數據定義的方式
  • 3 附錄:題目和回顧

0 前言

本文使用emu8086軟件進行8086匯編語言編輯和運行。

順便說一句,匯編語言源程序中的數字,默認是十進制,因此使用十六進制的數字的時候,必須有h或H后綴,本文也都遵循這樣的原則。

至于為什么默認十進制,我只能說,編譯器默認你是個人(不要笑!事實如此,如果默認你是機器,那么數字就默認十六進制了)。

0.1 先告訴你結論

在8086匯編語言中,定義字節類型的數據,比如

  • 字符
  • 字符串
  • 字節數值數組

都用DB進行定義,表示其后的數據都是字節型數據,并且按照順序依次存儲

舉例說明:

db 'a'
db 'abcdefghijk' ; 相當于 db 'a','b','c','d'……
db 0,1,2,3,4,5,6,7

1 8086匯編語言中的字符串

通常情況下,匯編語言中的字符串,都會被賦予DB(字節)數據類型,那么,為什么這樣做?

不能使用DW數據類型嗎?

當然可以,但是不建議使用

1.1 字符串的定義與使用

  1. 定義后使用:可以在任何位置這樣定義,不過建議在數據段內定義,然后再通過一些方式訪問并使用它們
data1 db 'hello'
data2 db 'world'
  1. 直接使用:可以在指令中作為立即數直接使用
mov ax,'ab'

1.2 直接定義的細節

1.2.1 使用DB數據類型

使用DB作為數據類型的時候,字符串長度不受限制,默認字符串的每一個字符占一個字節,并且存儲過程中,是按照一個字符占一個字節的方式,順序依次存儲的

源程序如下:

assume ds:data
data segmentdata1 db 'abcchsadhkjhsfaksaskhasf'data ends

對應的內存單元,原來是這樣的

0710:0000	00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		................
0710:0010	00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		................
0710:0020	00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		................

放入代碼段數據之后是

0710:0000	61 62 63 63 68 73 61 64-68 6B 6A 68 73 66 61 6B		abcchsadhkjhsfak
0710:0010	73 61 73 6B 68 61 73 66-00 00 00 00 00 00 00 00		saskhasf........
0710:0020	00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		................

這里,data1的值將會被編譯為這串字符串的首地址對應的偏移地址,也就是0000,此時,data1并不能夠代表字符串的全部字符,你可以把它理解為data1 db 'a',也就是第一個字符a是字節型數據,它的標號是data1,但是它后面的字符是沒有標號的。

這也就意味著,mov ax,data1會報錯,因為data1是字節型數據,而mov al,data1會得到al = 61H

將字符串規定為字節類型,是常用的,其他的了解即可,基本不會用到,下面簡單介紹。

1.2.2 使用其他數據類型

例如使用dw數據類型,則最多存儲2個字節

data1 dw 'ab' 

也就是說,如果不是db類型的字符串,則存儲字符的數量,是與數據類型相關聯的,例如dw 'abc'就是錯誤的,因為超越了2個字節。

對于其他數據類型,dddq等也是一樣的,不過這些并不常用。

1.3 直接使用的細節

對于8086CPU來說

  • 寄存器最大16位,也就是2個字節,比如ax,或者也可以是8位,比如al
  • 可以操作的內存單元,也是如此,最大是word ptr ds:[address](16位),或者byte ptr ds:[address](8位)

如果你想說32位或者更多,那是間接完成,也需要通過16位輔助來完成,我們這里說的是一步到位,直接使用

這也就意味著,我們使用的字符串,只能使用'a'或者'ab',這里的字母代表任何ASCII字符,在ASCII碼中,一個字符占1個字節,所以我們只有這兩種選擇,并且,要注意數據類型的匹配,比如mov al,'ab'就是非法的,mov ax,'abcd'也是非法的。

我來列舉一些常見情況,至于其他情況,都是其衍生品罷了。

1.3.1 賦值給寄存器

匯編語言程序為

mov al,'a'		
mov ax,'a'		
mov ax,'ab'

對于以上3條,編譯后的結果是

mov al,061h
mov ax,00061h
mov ax,06162h

執行后的結果是

al = 61h
ax = 0061h
ax = 6162h

1.3.2 賦值給內存單元

這里,假設ds = 1000h

匯編語言程序為(注意,要加上數字h!,目的是為了美觀)

mov byte ptr ds:[0],'a'
mov word ptr ds:[10h],'a'
mov word ptr ds:[20h],'ab'

編譯后的結果為

mov byte ptr [10000],061h
mov word ptr [10010],00061h
mov word ptr [10020],06162h

執行前內存為

1000:0000	00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		................
1000:0010	00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		................
1000:0020	00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		................

執行后內存為

1000:0000	61 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		a...............
1000:0010	61 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00		a...............
1000:0020	62 61 00 00 00 00 00 00-00 00 00 00 00 00 00 00		ba..............

思考:你是不是發現了什么規律,是不是對于某些地方也感到困惑?思考一下,然后再往下看

1.3.3 字符串直接使用的本質

就一句話,將字符按照ASCII碼規則,轉換為數字,這個數字可以理解為立即數,其余的事情,就是立即數相關問題了。

你可能看見了,當mov word ptr ds:[20h],'ab'之后,內存中是ba而不是ab,我想你知道原因了,這與在數據段定義不同,那里是順序的,這里是倒序的,原因在于,在數據段用db數據類型存儲,是一個一個字符存儲的,而這里是作為一個字來存儲的,是一個整體。

1.4 應用

思考題: 如果你有以下數據段的定義

assume ds:data
data segmentdata1 db 'dox'data ends

現在,你需要將'dox'修改為'DOX',應該如何做?如果要修改為'VEX',又該怎么做?

提示:

  1. 第一個問題,可以轉換為小寫字母變成大寫字母的問題
  2. 第二個問題,就是內存修改問題
    1. 你可以使用mov ax,'V'的方式,直接替換
    2. 也可以先定義好data2 db 'VEX'數據,再進行替換

2 擴展:數據定義的方式

為了避免內容冗雜,我單獨寫了一篇文章,鏈接在此

我希望你知道的是,學會了字符串的定義,也就學會了各種數據的定義,因為字符串定義的本質,就是數字定義,只需要按照編碼規則換成數字就行了。

3 附錄:題目和回顧

來自于《匯編語言》(王爽)第七章,此處只是為了記錄,讀者可不看。

 ; 全變成大寫字母,并且將外循環次數暫存到內存中
assume ds:data
data segmentdata1 db 'abc       gg    'data2 db 'hello        hq 'cycleCount dw ?data endsassume ss:stack
stack segmentcycle dw ?    stack endsassume cs:code
code segment
start:mov ax,datamov ds,axmov ax,stackmov ss,ax          ; 下面兩條語句不能二合一,因為匯編程序追求的是格式的統一與極簡mov sp,offset cycle    ; 不要使用 Magic Numbersub sp,2mov bx,0 ; 外層 控制行mov cx,2s0:;mov cycleCount,cx;push cycle      ; 注意此處,不是推入偏移地址這個數據,push offset cycle,而是直接推入數據; 【數據傳送】指令; 【錯誤!】推的是cx,不是cyclepush cx                 mov si,0 ; 內層 控制列mov cx,8s1: ; 字傳送,不浪費mov ax,[bx][si]    ; 為什么沒有造成不匹配報錯   【按照地址找數據,類型是自動匹配的】; 【自動匹配】【強制匹配】and ax,0DFDFHmov [bx][si],axadd si,2loop s1add bx,16;mov cx,cycleCountpop cxloop s0mov ax,4c00hint 21h
code ends
end start

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

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

相關文章

哲學家就餐(避免死鎖)(多進程版)

哲學家就餐&#xff08;避免死鎖&#xff09;&#xff08;多進程版&#xff09; 哲學家就餐利用信號量在多進程之間實現 下面展示一些代碼片段 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <sys…

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

0 前言 本文基于8086匯編語言&#xff0c;不過x86系列語言具備向下兼容特點&#xff0c;大多數情況都可以用。 與高級語言數據類型的自動轉換和強制轉換一樣&#xff0c;匯編語言的數據類型也有 自動匹配和手動匹配。 下面&#xff0c;我來介紹一下匯編語言的相關原則。 1 …

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

生產者消費者模型 線程同步典型的案例即為生產者消費者模型&#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…