⑴ 匯編中把數據段和代碼段定義在同一段內有好處么
好處是能讓編譯出來的程序節省幾個位元組的大小,另外能讓你在寫源碼的時候少打幾個字,因為不用弄數據段了嘛,不過在寫大程序的時候最好是把數據段和代碼段分開,因為那樣更清晰.當然如果你認為把數據和代碼放在一起更清晰的話,你可以堅持自己的性格
恩,這個位置是非常講究的
第一:在代碼段中定義的數據不能定義到CS:IP可能碰到的地方,因為變數一旦被CS:IP碰到的話,就會把數據當成指令執行了.CPU很生氣,後果很嚴重.例子:
正確的定義:
code segment
var01 db 64
start:
mov ax,cx
mov ds,ax
mov al,var01
mov ax,4C00H
int 21H
;也可以把"var01 db 64"放在這行里,放在這里的話上面定義的數據就不能要了
;CPU在執行完int 21H之後CS:IP就飄到別的地方去了,所以不會執行到這里
code ends
錯誤的定義:
code segment
start:
mov ax,cx
mov ds,ax
var01 db 64 ;CPU在執行的時候會光顧這里,所以不能定義在這里
mov al,var01
mov ax,4C00H
int 21H
code ends
第二:數據最好是定義在代碼段的最前面或者最後面,讓代碼段的一部分是數據,一部分是代碼,不然你如果一會是數據,一會是代碼的話,看源碼的人會很生氣的.但這條可能有例外的情況,例子:
code segment
start:
mov ax,cx
mov ds,ax
jmp OMG
var01 db 64 ;前一條指令會讓CS:IP指向下面的那條指令
;如果你認為這樣很美的話可以這么干
OMG:
mov al,var01
mov ax,4C00H
int 21H
code ends
宏定義定義在哪我不知道有什麼影響,不過一般好像都是定義在程序開頭的
子程序定義在start前面或者
mov ax,4C00H
int 21H ;(也就是程序返回代碼)
後面都一樣
也可以通過前面那個例子里,用jmp弄出一段不會直接執行的空間,這樣:
code segment
var01 db 64
start:
mov ax,cx
mov ds,ax
jmp OMG1
OMG2:
mov al,var01
ret
OMG1:
call OMG2
mov ax,4C00H
int 21H
code ends
我感覺這種方法非常2,其實子程序應該放在一起,像這樣:
code segment
var01 db 64
start:
mov ax,cx
mov ds,ax
call OMG1
call OMG2
mov ax,4C00H
int 21H
OMG1:
mov al,var01
ret
OMG2:
xor al,al
ret
code ends
⑵ 匯編語言dw後面的數據放哪裡ds還是cs
這部分一般在數據段定義 ds存放數據段段地址 cs存放代碼段段地址 一般會在代碼段中有這兩句 mov ax,data mov ds,ax 作用是把data數據段的段地址送給ds 這樣就實現了ds中地址是你定義的數據的段地址 cs中存放的代碼段的段地址 它和IP組合CS:IP 可以指向代碼段的某一條指令 這樣機器就知道從什麼地方開始執行指令了 執行一條後 IP自動加上剛剛執行的指令的長度 這樣CS:IP就指向了下一句 這樣就實現了一條接一條的來執行指令
但願對你有幫助
⑶ 程序的指令存放在哪個邏輯段
存儲器。
邏輯段就是程序設計中的數據分段不同的程序有不同的幾個分段。在8086的程序設計中,一個程序可以有代碼段CS、數據段SS、堆棧段SS和附加段ES。代碼段CS用於存放程序;數據段SS和附加段ES用於存放數據;堆棧段SS用於存放數據(包括暫存數據和保護現場的數據)。在形成物理地址時,CS、DS、ES和SS四個段寄存器的作用如下:當取指令時,CPU以CS寄存器的值作段基址,再加上IP中的16位偏移地址,得到指令的物理地址。
⑷ 匯編語言 數據段 代碼段 堆棧段 數據怎麼看
較好的編程習慣是代碼段放代碼、數據段放數據、棧段用來保存環境恢復環境以及存放少量的局部變數。
但這些分段並不是絕對的,早期的程序並沒有這些規矩,代碼、數據是容許混放的,16位的com格式的程序代碼、數據段、附加數據段、棧段是容許同段的。
單獨拿數據來說,數據是可以放在內存中的任何地方,只要容許你訪問。數據可以放在代碼段中,可以放在棧中,也可以放在系統的堆內存中。
⑸ 進程式控制制塊,數據段,程序段各自在內存的什麼地方
進程式控制制塊(PCB)在系統內存中,可以和其他進程同步執行
數據段存在靜態內存,用於保存程序已經初始化的變數
代碼段緊接著數據段,也在靜態內存中
另外還有保存局部變數的棧和保存動態分配空間的堆
在內存中它們如下關系:
========高地址 =======
程序棧 堆棧段
向下增長
空內存
向上增長
堆
------ 數據段
BSS
------
非零數據
========= =======
代碼 代碼段
========= =======
=========低地址 =======
棧(存放著局部變數和函數參數等數據),向下生長 (可讀可寫可執行)
堆(給動態分配內存是使用),向上生長 (可讀可寫可執行)
數據段(保存全局數據和靜態數據) (可讀可寫不可執行)
代碼段(保存代碼) (可讀可執行不可寫)
⑹ 程序代碼在內存中是怎樣放置的
一個程序至少有兩個段:數據段和代碼段。顧名思義數據段用來存放數據,也就是變數和數組之類,而代碼段則用來存放一個指令序列。這個指令序列就是編程語言匯編出來的最後結果,是一系列機器碼所表示的處理數據的步驟。CPU依次按照這個序列來處理數據,這就是程序的執行
⑺ 單片機數據段屬於ram的一部分,代碼段屬於rom的一部分,這樣理解對嗎
可以這樣理解,單片機的數據存儲器和程序存儲器是分開的,計算產生的數據存放於RAM,而程序只能存放於ROM
⑻ 8086/8088系統中,存儲器為什麼要分段,一個段的最大和最小各為多少位元組
8086/8088系統中,存儲器分段的主要目的是便於存儲器的管理,使得可以用16位寄存器來定址20位的內存空間。一個段最大為64KB,最小為16B。
存儲器一般用來保存程序的中間結果,為隨後的指令快速提供操作數,從而避免把中間結果存入內存,再讀取內存的操作。
由於存儲器的個數和容量都有限,不可能把所有中間結果都存儲在存儲器中,所以,要對存儲器進行適當的調度。根據指令的要求,管理安排適當的寄存器,避免操作數過多的傳送操作。
8086/8088CPU可直接定址1MB的存儲器空間,直接定址需要20位地址碼,而所有內部寄存器都是16位的,只能直接定址6KB,因此採用分段技術來解決。將1MB的存儲空間分成若干邏輯段,每段最長64KB,最短16B。這些邏輯段在整個存儲空間中可浮動。
(8)代碼段數據段放在哪裡擴展閱讀:
8086/8088CPU內部設置了4個16位段寄存器,它們分別是代碼段寄存器CS、數據段寄存器DS、堆棧段寄存器SS、附加段寄存器ES、由它們給出相應邏輯段的首地址,稱為「段基址」。段基址與段內偏移地址組合形成20位物理地址,段內偏移地址可以存放在寄存器中,也可以存放在存儲器中。
程序較小時,代碼段、數據段、堆棧段可放在一個段內,即包含在64KB之內,而當程序或數據量較大時,超過了64KB,那麼可以定義多個代碼段或數據段、堆棧段、附加段。
⑼ 程序運行時,程序代碼是在堆中還是在棧中還是在內存中
在內存中。
樓上說的沒錯,一般計算機的內存分為好幾個區域,每個區域都有自己的特回殊的作用。堆棧是答用來暫時存放數據和地址的。通常用來保護斷點和現場。在單片機中,發生中斷的時候cpu會執行中斷服務程序。然而在cpu執行中斷服務程序之前會先把斷點地址推入堆棧,把現場的數據也推入堆棧。當執行完中斷服務程序的時候,可以找到斷點的地址,然後繼續執行主程序。比如說我們使用計算機的時候,讓計算機睡眠的時候也是先把cpu正在執行的程序壓入堆棧保存起來。喚醒的時候可以很快的啟動並繼續執行睡眠前的服務。防止丟失數據。