16位彙編學習筆記(四) 偽指令和源程式

2021-10-04 16:38:42 字數 3362 閱讀 9830

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...