導航:首頁 > 數據分析 > 代碼段數據段放在哪裡

代碼段數據段放在哪裡

發布時間:2023-01-15 23:49:59

⑴ 匯編中把數據段和代碼段定義在同一段內有好處么

好處是能讓編譯出來的程序節省幾個位元組的大小,另外能讓你在寫源碼的時候少打幾個字,因為不用弄數據段了嘛,不過在寫大程序的時候最好是把數據段和代碼段分開,因為那樣更清晰.當然如果你認為把數據和代碼放在一起更清晰的話,你可以堅持自己的性格

恩,這個位置是非常講究的

第一:在代碼段中定義的數據不能定義到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格式的程序代碼、數據段、附加數據段、棧段是容許同段的。
單獨拿數據來說,數據是可以放在內存中的任何地方,只要容許你訪問。數據可以放在代碼段中,可以放在棧中,也可以放在系統的堆內存中。

⑸ 進程式控制制塊,數據段,程序段各自在內存的什麼地方

  1. 進程式控制制塊(PCB)在系統內存中,可以和其他進程同步執行

  2. 數據段存在靜態內存,用於保存程序已經初始化的變數

  3. 代碼段緊接著數據段,也在靜態內存中

  4. 另外還有保存局部變數的棧和保存動態分配空間的堆

    在內存中它們如下關系:

    ========高地址 =======
    程序棧 堆棧段
    向下增長
    空內存
    向上增長

    ------ 數據段
    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正在執行的程序壓入堆棧保存起來。喚醒的時候可以很快的啟動並繼續執行睡眠前的服務。防止丟失數據。

閱讀全文

與代碼段數據段放在哪裡相關的資料

熱點內容
win10雙屏拖文件 瀏覽:291
win10系統打開文件夾不對 瀏覽:444
線上有哪些批發商城app 瀏覽:632
mkv文件是什麼 瀏覽:817
文件夾xml怎麼改成word 瀏覽:293
excel表格如何建立資料庫 瀏覽:378
國外程序員兼職平台 瀏覽:575
如何在電腦上查看寬頻密碼是什麼 瀏覽:689
下級收到領導文件回復簽字寫什麼 瀏覽:405
廈門學少兒編程哪裡有 瀏覽:119
重要文件公司保留多少年 瀏覽:53
win10藍屏找不到系統文件怎麼處理 瀏覽:287
怎麼把手機word文件發送到微信里 瀏覽:57
網路學習的學分什麼時候到 瀏覽:376
qq飛車k2輪滑特性 瀏覽:321
cat寫入文件寫錯了 瀏覽:308
java增量編譯 瀏覽:10
網站排名突然掉了什麼時候能恢復 瀏覽:169
星光筆刷教程 瀏覽:41
電腦是怎麼儲存文件 瀏覽:615

友情鏈接