彙編的資料段和棧

2021-06-21 20:35:06 字數 1055 閱讀 7828

1.ds和[address]

例如:我們要讀取10000h單元的內容可以用如下程式進行

mov bx,1000h

mov ds,bx

mov al,[0]

上面的三條指令是將10000h(1000:0)中的資料讀到al中。

[...]表示乙個記憶體單元,[...]中的0表示記憶體單元的偏移位址。我們知道只有偏移位址是不能定位乙個記憶體單元的,那麼記憶體單元的段位址是多少呢?指令執行時,8086cpu自動獲取ds中的資料位記憶體單元的段位址。

再來看一下,我們如何用mov指令從10000h中讀取資料。10000h用段位址和偏移位址表示為1000:0,我們先將1000h放入ds,然後用mov al,[0]完成傳送。mov指令中的說明操作物件是乙個記憶體單元,中的0表示這個記憶體單元的偏移位址是0,它的段位址預設放在ds中,指令執行時,8086cpu會自動從ds中取出。

如何將乙個資料放入ds暫存器呢,直接用mov ds 1000h?現在並非如此,8086cpu不支援將資料直接送入段暫存器的操作,ds是乙個段暫存器,所以mov ds,1000h這條指令是非法的。那麼如果將1000h送入到ds中?只要用乙個暫存器來進行中轉,即先將1000h送入乙個一般的暫存器,如bx,再將bx的內容送入ds。

2.字的傳送

前面我們用mov指令在暫存器和記憶體之間進行位元組型資料的傳送,因為8086cpu是16位結構,有16根資料線,所以,可以一次傳送16位的資料,也就是說可以一次性傳送乙個字。我們只要在mov指令中給出16位暫存器就可以進行16位資料的傳送了。比如:

mov bx,1000h;

mov ds,bx;

mov ax,[0];

mov [0],cx;cx中的16位資料送到1000:0處

3.棧8086cpu的入棧和出棧操作是以字為單位進行的。注意:字型資料用倆個單元存放,搞位址單元存放高8位,低位址段元放低8位。有倆個問題如下:

1.cpu如何知道一段記憶體空間被當做棧?

2.執行push和pop時候,如果知道哪個單元是棧頂

答案:ss:sp,段暫存器ss存放棧頂段位址,sp存放棧頂偏移位址。入棧時,棧頂從高位址向低位址方向增長。

彙編 在bss段和data段宣告資料的區別

在bss段中宣告資料的乙個好處是資料不包含在可執行的程式中。在資料段中定義資料時必須被包含在可執行的程式中,因為必須使用特定值初始化。test1.s section text global start start movl 1,eax movl 0,ebx int 0x80執行 as o test1...

text段 data段 堆和棧 和bss段

一 程式的記憶體分配 1.1個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的...

text段,data段,bss段,堆和棧

乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...