火箭附加段 匯編語言,請問變量定義在附加段和定義在數(shù)據(jù)段有什么區(qū)別?。?/h1>
匯編語言,請問變量定義在附加段和定義在數(shù)據(jù)段有什么區(qū)別???在8086中,數(shù)據(jù)可以在任何地方定義,只要段寄存器的值在內(nèi)存尋址之前是正確的例如,如果數(shù)據(jù)是在代碼段中定義的,則可以通過類為mov ax,CS
匯編語言,請問變量定義在附加段和定義在數(shù)據(jù)段有什么區(qū)別???
在8086中,數(shù)據(jù)可以在任何地方定義,只要段寄存器的值在內(nèi)存尋址之前是正確的
例如,如果數(shù)據(jù)是在代碼段中定義的,則可以通過類為mov ax,CS:[BX]的方式進行尋址,或者CS的值可以提前發(fā)送到DS:
mov ax,CS
mov DS,ax
,則可以這樣直接尋址:mov ax,[BX
]如果在附加段中定義,則附加段對應的段寄存器需要像數(shù)據(jù)段一樣初始化
在保護模式下,默認情況下不能寫入代碼段,因此最好不要在保護模式
8086 CPU有20條地址線,最大可尋址內(nèi)存空間為1MB。8086的寄存器只有16位,指令指針(IP)和索引寄存器(Si,DI)也是16位。用16位地址尋址1MB空間是不可能的。因此,需要對內(nèi)存進行分段,即將1MB空間分成若干段,每段不超過64KB,并在8086中設置四個16位段寄存器來管理四段:CS為代碼段,DS為數(shù)據(jù)段,SS為堆棧段,ES為附加段。對內(nèi)存進行分段后,每個段都有一個段基址。段寄存器存儲段基址的上16位。16位地址可以左移4位(后跟4個零),形成20位段基址。
內(nèi)存為什么要分段?分成多少種段?段與段寄存器的區(qū)別?
我將討論段寄存器:它是存儲段地址的特殊寄存器。它有代碼段CS(存儲偏移地址寄存器IP)。注:這是8086和8088中的80386,后跟一個e,依此類推)。數(shù)據(jù)段DS(SP-BP)堆棧段SS(BX-Di-Si或16位)附加段es(用于字符串指令的Di)和FS-GS)每個段都有一個特定的起始地址,并且用途不同。代碼段存儲正在運行的程序,數(shù)據(jù)段存儲當前正在運行的程序的數(shù)據(jù)。堆棧是一種數(shù)據(jù)結構。堆棧段定義堆棧所在的區(qū)域,附加段是附加數(shù)據(jù)段。段與段寄存器的關系:程序員在編寫程序時,應按上述規(guī)定將程序的所有部分放在指定的段區(qū)域(放什么),每個段獨立占用64KB的存儲區(qū)域。為什么要分割?顯然,為了方便管理,有一個術語叫做“分段存儲管理”(和分頁)。目的是滿足用戶(程序員)在編程和使用中的需求。例如,用戶根據(jù)邏輯關系將作業(yè)劃分為多個段,每個段從0開始編譯。因此,要訪問的邏輯地址是由段名稱(段編號)和段編號內(nèi)部偏移量(段地址中)組成的,因此非常必要。查看原始post>>
數(shù)據(jù)段:數(shù)據(jù)段通常指用于在程序中存儲初始化全局變量的內(nèi)存區(qū)域。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配。
堆:堆用于在進程操作期間存儲動態(tài)分配的內(nèi)存段。它的大小不是固定的,可以動態(tài)地擴大或縮小。當一個進程調(diào)用malloc和其他函數(shù)來分配內(nèi)存時,新分配的內(nèi)存被動態(tài)地添加到堆中(堆被擴展);當free和其他函數(shù)被用來釋放內(nèi)存時,釋放的內(nèi)存被從堆中移除(堆被減少)