80x86組合語言學習筆記(四)

2021-05-24 08:52:40 字數 2449 閱讀 5600

這次總結一下組合語言中的變數和標號

首先,變數和標號均表示儲存單元,也就是某個位址,但不同的是,變數表示的儲存單元用來儲存數值,而標號表示的單元則是用來儲存**。由此可以推斷,變數應該指向ds,標號應該指向cs。

舉個例子:count    db      5                      ;其中db就是變數

start:   mov    ax,[1234h]       ;其中start就是標號

標號的定義很簡單,就不多說了,這裡總結一下變數的定義:

一.變數的定義

1.定義位元組變數

定義位元組變數是使用db偽指令

例:bdata1      db       55h

其中bdata1指向儲存數值55h的位址,並且是以1位元組為儲存、偏移單位為。同時,變數的定義後面可以有不止乙個資料。

例:bdata2      db       55h,23h,53h

bdata3      db        12h

同時,也可以用這條指令定義字串

例如:string   db      'hello!'

2.定義字變數和雙字變數

定義字變數是使用dw偽指令,定義雙字變數是使用dd偽指令。

這兩條指令與db類似,只不過dw是以字(2位元組)為儲存、偏移單位;dd是以雙字(也就是4位元組)為儲存、偏移單位。

3.定義沒有初始值的變數

與定義普通變數類似,只是在資料的位置用『?』代替

例:bdata4      db      55h,23h,65h,?,?

這樣,就僅僅給變數分配儲存單元,但其中並沒有任何資料。

4.定義其他型別變數

使用dq和dt分別定義8位元組和10位元組的變數。

5.快速定義

有時我們想在一段儲存空間內填入若干個相同的資料,則可以使用迴圈操作符來快速定義變數

例:buffer     dw        8  dup  (55h)

其中8是要填入的資料的個數,括號內則是要填入的資料,這條語句執行完後,從buffer所指向的儲存空間開始再偏移7個字的空間內均儲存的是0055h。

二.獲取、指定變數和標號的屬性

變數和標號的屬性包括:

1)所在儲存單元的段值

2)段內偏移值

3)型別,變數的型別有:位元組(byte)、字(word)、雙字(dword);標號的型別有:段內標號(far)、段間標號(near)。

1.獲取屬性

獲取屬性使用的是析值偽指令,這些指令有:

seg                變數名、標號名                 ;返回段值

offset           變數名、標號名                 ;返回偏移值

type               變數名、標號名                 ;返回型別

length           變數名                            ;返回利用dup定義的變數中元素的個數

size               變數名                             ;返回利用dup定義的變數所佔的位元組數

其中,返回的型別使用數值表示的,對應如下:

位元組       1

字          2

雙字       4

段內標號  -1

段間標號  -2

2.指定屬性

指定屬性使用的是屬性操作偽指令,一共有兩個:ptr和this

1)ptr

組合語言中,我們要明確指出要訪問的儲存器運算元的型別,ptr就是用於臨時性的強制指定變數或標號的型別,這與c++中變數的強制轉換類似。

例:mov        word    ptr    [si],1h   ;這條語句就是以字為單位訪問1h

這條語句可以用來特定訪問某個變數的某一部分。

例:word1     dw      2255h

mov      ax,byte    ptr   word1

在這個程式段中,是將變數word1的低位,也就是55h送到ax中。

2)this

這條指令返回乙個指定型別的儲存器運算元,而不為它分配儲存空間,但保留此運算元的段值和偏移值,作為下乙個即將分配的單元的段值和偏移值,也就是第乙個運算元的數值是無意義的,只是需要其型別、段值和偏移值。這條指令主要是用在符號定義語句(後面的知識)中,來定義乙個具有型別、段值和偏移值的表示儲存器運算元的符號。

例:my_byte     equ     this    byte

my_word    dw     ?

這段程式執行後,my_byte和my_word擁有相同的段值和偏移值,my_byte是對my_word的低位元組的訪問,若定義my_word時用的是db,則對兩個變數的訪問是一樣的。

80x86組合語言學習筆記(三)

今天上午開始看組合語言程式設計初步,這一章分為 組合語言語句 變數和標號 常用偽指令語句和源程式組織 順序程式設計 分支程式設計 迴圈程式設計這幾塊,這次總結一下組合語言的語句。首先組合語言的語句分為指令語句 偽指令語句和巨集指令語句,其中指令語句是可以被譯成機器指令的語句,例如將某運算元從乙個暫存...

80X86學習筆記 組合語言的語句

1.語句的種類 指令語句和偽指令語句兩類,指令語句有著與其對應的機器指令,偽指令語句沒有與其對應的機器指令,只是指示匯程式設計序如何彙編源程式,包括符號的定義,變數的定義,段的定義。2.語句格式指令語句和偽指令語句的格式相似,都由四部分組成。格式 標號 指令助記符 運算元 注釋 偽指令語句格式 名字...

80x86組合語言 分類統計

組合語言的程式設計題!急 有100個學生成績,存放在以data為首址的位元組儲存單元中。試統計其中90 含90 以上的人數,60 90 含60 之間的人數,60以下的人數,分別存入max,middle,min三個變數中。15 分鐘前 做而論道 十七級 最快回答 assume ds qq,cs cc ...