2,等號語句'='
3,定義符號名語句
二,段定義語句
三,乙個完整的組合語言源程式
課後作業
通過符號定義語句,可以把常數,表示式等用符號表示。恰當地使用符號定義語句,不僅可以大大方便程式的書寫和閱讀,也有利於程式的除錯和修改.
count equ 100 ;符號count代表常數100
buff equ 4count ;buff等價於4100
hello equ 『hello』
move equ mov ;move代替mov
count equ cx ;count代替cx
varw equ this word ;varw的型別是字
varb dw ? ;段值和偏移與varw相同
flag dw ?
flag1 equ byte ptr flag
flag2 equ byte ptr flag + 1
注意:只是起別名,不會為符號分配儲存空間(也可以理解為建立了乙個沒有空間的變數);等價語句定義的符號不能被再次使用,否則會報錯
用符號來表示乙個常數(賦值操作)
語法:符號名 = 表示式
注意:此處的表示式要能計算出準確的數值,符號可以被多次賦值
格式:符號名 label 型別
型別有:byte,word, dword,near,far等。
功能是定義有符號名指定的符號,使該符號的段屬性和偏移屬性與緊接著的儲存單元相同,該符號的型別為引數所規定的型別。
buffer label word
buff db 10 dup(?)
;buffer的型別是word,段屬性和偏移屬性與buff相同,和equ this的作用和相似.
用來按段組織程式和利用儲存器,與儲存器的分段結構相對應。
data segment ;資料段
db 1,2,3,4,5
data ends ;資料段結束
例如:
code segment
mov ax,data ;把資料段ds的段值送入ax
mov ds,ax ;再送入ds(此處如此操作是因為段暫存器只能間接賦值)
mov dx,offset mess
mov ah,9 ;dos系統功能呼叫,顯示字串mess
int 21h
mov ah,4c00h ;dos系統功能呼叫,結束匯程式設計序
int 21h
code ends
當段名作為符號被引用時,表示對應段的段值。
由於指令語句和資料定義語句都要占用儲存單元,所以一定要安排在某個段內。
匯程式設計序根據段開始語句和段結束語句判斷出源程式的段劃分,為了有效地產生目標**,匯程式設計序要了解段和段暫存器之間的對應關係。
格式:assume 段暫存器名: 段名【, 段暫存器: 段名…】
例子:
assume cs:code, ds:data1, ss:stack, es:data2 ;對應關係就建立完畢了
特別注意:段使用設定語句是偽指令語句,不能設定段暫存器的值,最後還是需要通過指令語句給段暫存器賦值.
例:
testseg segment
org 100h ;調整當前位址計數器的值為100h
begin: mov ax,1234h ;此處begin的偏移為100h
......
org 500h
var dw 1234h
......
testseg ends
組合語言用$符號表示當前位址計數器的值,可以直接引用
org +8記
住+8 記住
+8記住
array dw 1,2,$+4,3,4,$+4
(終於開始了,理論熬得太難受了)
;專案名稱:hello(筆者自己寫的哦)
;功能:顯示hello world
;*************************
assume cs:code, ds:date, ss:stack
stack segment stack
dw 256 dup(?)
stack ends
date segment
string db 'hello world!', 0dh, 0ah,'$' ;0dh回車,0ah,換行,'$'結束符
date ends
code segment
start:
mov ax, date
mov ds, ax ;給資料段暫存器賦值
mov dx, offset string ;把mess變數的偏移位址賦給dx
;以下為系統呼叫
mov ah, 9 ;顯示資訊「hello」
int 21h
mov ax, 4c00h ;返回dos
int 21h
code ends
end start
該程式含有3個邏輯段,堆疊段,資料段,**段,對應3個物理段。dos把控制權轉到該程式時,將設定cs:ip。
源程式至少有乙個**段cs,多的可以有幾十個段。
堆疊段ss,由於dos系統在裝載沒有堆疊段的程式時,會自動指定乙個堆疊段,所以通常省去了,前提是程式比較小,不應該超過64k。
指令語句和資料定義偽指令應安排在段內。部分偽指令語句可安排在段外,例如符號定義語句一般安排在源程式的開始處。作為主程式源程式最後必須要有結束語句。
end [標號]
標號:end start 和開始的標號start對應
也可以是end begin 開始的地方也是begin就好
往往是源程式的最後一條語句。
(實在著不住了,直接留這裡)
1、請舉例說明偽指令assume的作用。
2、設在某個程式片段中有如下語句,請說明各符號的屬性:
symb1 label byte
symb2 equ this byte
symb3 dw ?
symb4 equ byte ptr symb3
3、為什麼說組合語言中的等價語句equ可以理解為簡單的巨集定義?請舉例說明。
4、設在某個程式片段中有如下語句,請說明各符號所表示的值:
symb1=10
symb2=symb1*2
symb1=symb1+symb2+4
symb3 equ symb1
5、請改寫程式t3-1.asm,使其只有乙個段。
6、說明指令』jmp $+2』指令中的機器碼中的位址差值是多少。
7、源程式是否一定要以end語句結束?程式是否一定從**段偏移0開始執行?如果不是,那麼如果指定?
8086彙編學習筆記5 偽指令
偽指令不同於彙編指令,彙編指令有對應cpu能夠識別的機器碼,而偽指令主由編譯器識別。1.段宣告 段名 segment 段名 ends segment和ends是用來定義乙個段,segment是乙個段的開始,ends是乙個段的結束,乙個段必須有個名稱來標識。2.匯程式設計序結束標記end end是乙個...
arm學習筆記四 arm偽指令
arm偽指令 符號定義偽指令 定義arm匯程式設計序中的變數 對變數賦值以及定義暫存器的別名 定義全域性變數 gbla 全域性數字變數,初始化值為0 gbla 全域性變數名 示例 如下 gbla test1 定義全域性數字變數test1 test1 seta 0x123 將該變數賦值為0x123 g...
嵌入式學習筆記 彙編常用符號與偽指令
彙編指令中的注釋符號 表示後面附帶的是立即數 以冒號結尾的指令是標號,標記指令的被分配的位址,類似與c中定義的變數,通過變數代替位址 表示當前指令位址 例如,彙編中死迴圈的實現 b 偽指令前面通常都帶乙個點,以顯示出於指令的不同 globe start給start外部鏈結屬性 section tex...