區分彙編中的變數和標號

2021-06-17 19:25:17 字數 4840 閱讀 6718

概括的說

當程式中要跳轉到另一位置時,需要有乙個標識來指示新的位置,這就是標號,通過在目標位址的前面放上乙個標號,可以在指令中使用標號來代替直接使用位址。

使用變數是任何程式語言都要遇到的工作。變數是計算機記憶體中已命名的儲存位置,在大部分的語言中都有很多種類的變數,如整數型、浮點型和字串等,不同的變數有不同的用途和尺寸,比如說雖然長整數和單精度浮點數都是32位長,但它們的用途不同。

顧名思義,變數的值在程式執行中是需要改變的,所以它必須定義在可寫的段內,如 .data和 .data?,或者在堆疊內。按照定義的位置不同,masm中的變數也分為全域性變數和區域性變數兩種。

詳細地~~~~~

標號:標號(label)是為一組機器指令所起名字.標號可有可無,只有當需要用符號位址來訪問該語句時,才給此語句賦予標號.標號是程式目標標誌,總是和某位址相聯絡,供轉移或迴圈指令控制轉移使用.

1 標號屬性

因標號表示是指令位址,所以它有三個屬性,即段屬性、偏移屬性和型別屬性.段屬性即段位址,標號段必須在cs中.偏移屬性是表示該標號到段首位址距離,單位是位元組,是16位無符號整數.型別屬性是距離屬性,指標號和轉移指令距離,該標號在本段內引用,距離在-128~ 127之間時稱短標號,距離屬性為short,當標號在本段,距離在-32768~ 32767之間時稱近標號,距離屬性為neat,當引用標號指令和標號不在同一段時稱遠標號,距離屬性為far.

2 標號定義

標號定義有三種方法:

(1) 隱含說明標號距離屬性為short和near標號可以使用隱含說明,即在**段中定義,識別符號後加冒號,放在一條彙編指令操作符前面.例:

next: mov  ax,bx

----------     

loop next

- - - - - - - - -      

next1: cmp  ax,bx

ja  next1 

其中next和next1都是標號名.

(2) 用label定義標號

對於屬性為near和far標號均可以用這種定義.格式是:

標號名 label   near/far

例如:next label near/far    

- - - - - - - - -         

loop   next

(3) 用equ定義標號

對於屬性為near和far標號也可用equ定義.格式是:

標號名 equ this neat/far

例如:

next equ this near 

- - - - - - - - -            

loop  next

3 標號使用

(1) 無條件轉移指令中標號作為轉移位址

格式:

jmp   標號

其中標號可以是短標號,近標號或遠標號

(2) 迴圈指令中,標號作為轉移位址

格式:loop   標號

其中標號只能是短標號

(3) 條件轉移中標號作為轉移位址

格式:

條件轉移指令   標號

其中標號只能用短標號

(4) 屬性分離符

取段位址算符seg

例如:mov ax,seg next

seg next 就是取標號next所在段段位址.

取偏移量算符offset

例如:mov bx, offset nex

其中offset next就是取標號next有效位址,該語句等效於:lea bx, next

取型別算符type

例如:

mov ax, type next

若next為近標號,則type next值為ffffh(-1),若next為遠標號type next值為fffeh(-2).其中-1和-2無真正物理意義,僅以數值表示標號型別而已.

變數:變數(variable)代表存放在某些儲存單元資料,這些資料在程式執行期間可以隨時被修改.變數是通過變數名在程式中引用,變數名實際上是儲存區中乙個資料區名字,以變數名資料方式供程式設計師使用,作為指令或偽.指令運算元,大大方便了程式設計者.

由於變數是在邏輯段中定義.這就決定了變數和標號一樣具有段屬性、偏移屬性和型別屬性,前兩個和標號屬性相同,而型別屬性是指出資料區資料項訪問單位是位元組(byte),字(word)或數字(dword)等.可見變數和標號主要區別在於變數指是資料,而標號則對應是指令

(1) 變數定義

變數通常也有三種定義法

用偽指令db,dw,dd等來定義

格式:[變數名] 定義資料偽指令〈表示式〉

其中變數名可有可無,若沒有名字則該變數為無名變數.表示式可以是常數、保留符號"?"、ascii碼字串(只能用db定義)、位址表示式(不能用db定義)、預置資料**和用dup定義重複值.變數名可在任一邏輯段中定義,其後邊不緊跟冒號而是加一空格

.例如:a db 100;a為乙個位元組,值為100.

b db 100,2 3;b值為100,b 1值為6.

c db 'abc';c值為41h,c 1值為42h,c 2值為43h.d db ?;

d是乙個位元組,預留乙個位元組,可以置入任何內容.

e db 23 dup(0);定義23個0,每乙個0佔乙個位元組.

f db 3 dup(1,2 dup(0));定義9個數,順序為:1,0,0,1,0,0,1,0,0.

g dw 'ab','cd';g值為4142h,g 2值為4344h.

h dw 2 3;h為乙個字,存放順序為06,00h

i dw ? 預留乙個字,佔兩個位元組單元,

用偽指令label定義變數

格式:

變數名 label byte/word/dword

例如:

buf label byte

db 21

它等價於 buf db 21

用偽指令equ定義變數

格式:變數名 equ this byte/word/dword

this是定義任意型別算符,它同label一樣用於建立變數或標號型別屬性,而其段屬性為語句所在段段位址,偏移屬性為所在位置下乙個能分配到可用偏移位址.例如:

stack segment

dw 100 dup(?

top equ this word(或top label word)

stack end

變數top被定義為字型別,它偏移量應為stack段定義100個字後下乙個字偏移量,它恰就是堆疊指標sp初值,因此經常用這種方法為sp賦初值.

雙重定義變數名利用隱含方式和顯示方式雙重方式,可以對同一位置定義為雙重變數.

格式 〈變數名〉 equ this〈型別〉

〈變數名〉 db/dw/dd…

例如:

ab equ this byte

(或ab label byte)

aw dw 50 dup(0)aw定義為字變數,在aw前使用了this byte,定義了乙個位元組型別變數,訪問同乙個位置,用ab按位元組訪問,用aw則按字訪問.

(2) 變數訪問

變數名作為儲存單元直接位址

變數名用直接定址時,變數型別必須與指令要求相符合.

例如:ab已定義位元組變數,aw定義為字變數,用變數名作直接定址形式如下:

mov ah,ab

mov ax,aw

用合成運算子ptr臨時改變變數型別

接上例用

mov cx,word ptr ab

mov cl,byte ptr aw

則可臨時把ab變為字型別,aw變為位元組型別,但段和偏移屬性不變.

變數名作為相對定址中偏移量

例如:

mov ax,ab〔si〕

mov ax,aw[bx][si]

在這裡ab,aw分別表示它們偏移量而不是它們所表示資料,常用於陣列或**操作中,ab[si]就表示ab陣列中第si個元素.

屬性分離符

其中seg和offset用法和標號相同,分別表示取變數所在段段位址和變數偏移位址.而type運算子,將回送該變數型別所表示位元組數.

例如:設ab為位元組變數,aw為字變數,則:

mov ah,type ab即mov ah,1

mov ax,type aw即mov ax,2

取變數資料項個數運算子length對於變數定義時使用dup情況,匯程式設計序將回送dup前重複次數,即分配給該變數單元數,若表示式有多個dup,則取第乙個dup項,其它情況則回送1.

例如:array dw 50 dup(0)則

mov cx,length array即mov cx,50

array1,dw1,2,3 則

mov cx,length array1

即mov cx,1

可見length表示陣列元素個數,而不管其型別.

取變數資料項長度算符size

size算符,匯程式設計序將回送分配給該變數位元組數,即

size=length type

例如:

array dw 50 dup(0) 則

size array=50 2=100

要注意:對字串變數求其長度,使用size不能達到目.

例如:

st db 'abcdefg' 則

size st值為1而不是7,欲求字串長可用count equ $-st,則count值為7,其中$為定義st一串字元後下乙個可用偏移位址.

3 2 7 變數名僅對應資料區第乙個資料項

例如:

word dw 20 dup(?)

mov ax,word;第乙個元素送ax,

mov ax,word 38;第20個元素送ax.

ARM彙編中的標號

arm彙編中的標號 標號 label 是為一組機器指令所起名字,表示程式中的指令或者資料位址的符號。標號可有可無,只有當需要用符號位址來訪問該語句時,才給此語句賦予標號。通過在目標位址的前面放上乙個標號,可以在指令中使用標號來代替直接使用位址。標號是程式目標標誌,總是和某位址相聯絡,供轉移或迴圈指令...

ARM彙編中的標號

1 標號 在arm 彙編中,標號代表乙個位址,段內標號的位址在彙編時確定,而段外標號的位址值在連線時確定。根據標號的生成方式,可以有以下3 鐘 基於pc 的標號 基於pc 的標號時位於目標指令前的標號或程式中的資料定義偽指令前的標號,這種標號在彙編時將被處理成pc 值加上或減去乙個數字常量。它常用於...

ARM彙編中的標號

標號 label 是為一組機器指令所起名字,表示程式中的指令或者資料位址的符號。標號可有可無,只有當需要用符號位址來訪問該語句時,才給此語句賦予標號。通過在目標位址的前面放上乙個標號,可以在指令中使用標號來代替直接使用位址。標號是程式目標標誌,總是和某位址相聯絡,供轉移或迴圈指令控制轉移使用。標號是...