2010-11-05 85 views
2

我已經開始學彙編。我遇到了這些線。彙編代碼的說明

;*************************************************; 
; Second Stage Loader Entry Point 
;************************************************; 

main: 
    cli ; clear interrupts 
    push cs ; Insure DS=CS 
    pop ds 

在第二行代碼中,代碼段被推送到堆棧(我認爲是這樣)。我在許多代碼中看到它。爲什麼我們應該這樣做,以及它如何確保DS = CS? DS在第三行彈出堆棧(我認爲是這樣)。爲什麼這樣做?它彈出堆棧意味着它被推到堆棧之前。沒有代碼。有人可以向我解釋這一切嗎?提前致謝。

回答

4

確保這一點不是push cs,它是push cs; pop ds;組合。

第一條指令將當前值cs複製到堆棧中,第二條指令將該值從堆棧中拉出並放入ds寄存器。


響應於您的請求的詳細信息,讓我們開始以下堆棧和寄存器:

stack=[1,2,3], cs=7, ds=6 

push cs後,其推動cs寄存器的值壓入堆棧:

stack=[1,2,3,7], cs=7, ds=6 

pop ds之後,它從堆棧中彈出一個值並將其置於ds寄存器中:

stack=[1,2,3], cs=7, ds=7 

而且基本上就是這樣。


我不記得我的頭頂部是否有可能與mov指令段寄存器之間傳輸(我不認爲它是,但我可能是錯的,而這將需要推/流行順序)。這link似乎證實:沒有mov選項與段寄存器作爲源目的地。

但即使是這樣,彙編程序員通常會選擇更合適的指令,無論是速度還是緊湊代碼(或兩者),例如使用xor ax, ax而不是mov ax, 0

+0

你能詳細解釋一下嗎?如何推ds; pop cs確保ds = cs? – narayanpatra 2010-11-05 07:00:37

+1

有沒有更多的解釋,如果你沒有看到的重點,這是值得懷疑的,如果你應該學習asm .. – joni 2010-11-05 07:02:26

+0

@paxdiablo:謝謝兄弟。你的解釋清除了我的疑惑。 – narayanpatra 2010-11-05 07:23:36

0

通過將CS的值推入堆棧並將其彈出到DS中,可確保DS具有與CS相同的值。

我還沒有在彙編程序中編程一段時間,但我認爲沒有直接的方法從一個段寄存器移動到另一個。

您可以將堆棧視爲一堆數據。你把東西推到上面,它會一直保持在那裏,直到你彈出它的一堆。這樣你就可以使用棧來交換數據。但大多數情況下,您使用它來保存數據,以便您可以將寄存器用於其他目的,並在稍後恢復內容。

執行代碼時會發生這種情況。

1)初始情況

CS has value X 
DS has value Y 
Stack has .... 

2)推CS

CS has value X 
DS has value Y 
Stack has ...., X 

3)彈出DS

CS has value X 
DS has value X 
Stack has .... 

但什麼是段寄存器。 在過去,8086有16位地址寄存器,但有20位地址空間。因此,他們使用段寄存器通過將段寄存器乘以16將二者組合到20位空間,並添加內存位置。爲了節省空間,我們有指針(沒有段在段內跳轉)和遠指針(有段)。

隨着80286保護模式的介紹,段寄存器被重新用作段描述符。他們指出了一個記憶位置,它提供了足夠的信息來到真實的空間。但是現在我們有了線性地址空間(虛擬映射到真實內存)。

+0

我認爲這個術語有點不對。 IIRC CS,DS,...是選擇器寄存器,它指向段存儲器中的結構描述符。 – ninjalj 2010-11-06 19:06:45

+0

@ninjalj,原來他們在哪裏段註冊。名字依然存在,功能已經改變。 – 2010-11-06 22:04:25

+0

我指的是這部分:「段寄存器被重新用作段描述符。」段描述符應該是選擇器寄存器。 – ninjalj 2010-11-07 01:12:11

4

csds只是寄存器,非常像佔位符/變量,更多information about registers read here。在第二行中,您說push cs這意味着您將cs的內容放到堆棧上,並在以下行pop回到ds

剛剛發生的事情是,您將cs複製到ds

push是,說:「把這個堆棧的頂部」

pop的指令,說一旦你做了pop值是「採取從堆棧頂部值」

的指令不再存儲在堆棧上。

+0

可能是因爲cs和ds是寄存器而不是內存位置,誰知道? – paxdiablo 2010-11-05 07:04:58

+0

不是我,但CS和DS不是內存地址,它們是寄存器。 – 2010-11-05 07:05:01

+0

這是更好的解釋之一。他明白我想問的問題用簡單的語言解釋。可能是cs ds可以是寄存器,但是我理解了pop和push的概念。 – narayanpatra 2010-11-05 07:05:24

0

像在評論中寫的,push cs然後pop ds確保ds=cs?push cs將cs的值放在堆棧頂部,然後pop ds從堆棧中刪除該值並將其存儲在ds中。

1

'將此寄存器壓入堆棧,彈出堆棧到此寄存器'有時可以通過MOV指令完成,例如MOV ax,dx。但是一些寄存器到寄存器的MOV指令在指令集中不可用,並且IIRC MOV ds,cs不可用。這可能是把它放在內存中的原因(好,緩存,真的)並將其讀回來。