1樓:砍侃看
push可以儲存現場,然後呼叫其他函式,等其他函式返回後,又可以接著原來的執行。push也可以將引數傳遞給函式呼叫。當然還有其他的作用。
彙編裡的push功能是壓棧但為什麼要壓棧的呢?
2樓:匿名使用者
計算機程式用來放資料的地方有兩種,一個是堆,一個是棧。棧一般用來放一些函式的臨時變數,還有中斷和呼叫函式時的返回地址。因為這些地址都是臨時的,所以在棧的出棧和進棧的時候可以動態的進入和刪除。
呼叫函式和中斷的時候,臨時變數和返回地址就暫存在棧中。函式呼叫完了,臨時變數和返回地址就從棧刪除了。所以棧一般來說是臨時變數,呼叫函式會自動**記憶體。
這就是push 和 pop 的功能了。相當於一個暫時儲存資料的地方。 而堆的話一般用來動態分配記憶體,分配的記憶體一般不會自動釋放。
3樓:匿名使用者
計算機在運算的時候大部分情況會把資料放到暫存器裡運算,而呼叫函式的時候,會有新的數值要使用這些暫存器,所以要把這些暫存器裡的內容儲存起來,就是保護現場。因為棧的先入後出非常適合這一操作,所以每次函式呼叫前都有入棧操作,函式返回是出棧還原現場
關於組合語言問題,入棧出棧什麼用
4樓:匿名使用者
組合語言中堆疊的操作有專門的語句指令。
入棧指令是:push
出棧指令是:pop
比如:mov a,30h ;將一個壓縮bcd碼送累加器apush acc ;壓棧保護
anl a,#0fh ;保留低四位
mov 30h,a ;回送給30h
pop acc ;出棧
swap a ;高低四位互換
anl a,#0fh ;保留低四位
mov b,#10 ;b送10
mul ab ;乘10
add a,30h ;與個位相加
mov 30h,a ;回送給30h
以上程式段將一個壓縮bcd碼轉換為十六進位制。
5樓:匿名使用者
保護資料用。就是將ds ax 裡的資料先暫存在堆疊裡,這就是入棧(指令為push)。然後,可以對它們進行操作而不會影響原來的資料。到需要原來的資料時,再出棧(pop) 。
6樓:匿名使用者
對於現代的計算機來說,棧是一種非常關鍵、極其重要的資料結構。
棧就相當於一個細長的裝彈珠的瓶子(瓶口、瓶身內部截面均只能通過一個彈珠),不同顏色的彈珠只能從瓶口裝入,也只能從瓶口取出,在瓶內的彈珠的順序是不能改變的。這些彈珠具有「先進後出、後進先出」的特性。瓶子有一定的長度,裝滿彈珠後就不能再裝了,再裝就直接滾跑了(溢位)。
程式不都是線性的,有分支、有迴圈,有主程式、也有子程式。在子程式中,棧通常用來儲存現場(進棧--push、pusha、pushf),在棧中定義區域性變數,執行完成後要恢復現場(出棧--popf、popa、pop)。沒有棧這種資料結構,很難想象現在的軟體是個什麼樣子。
例:用組合語言(ma**)編寫程式段,實現從鍵盤輸入十個一位10進位制數後累加以非壓縮bcd碼形式存放在ah和al中。
code segment
assume cs:code
*** 100h
start:
jmp bbb
lfcr db 13,10,'$'
bbb:
push cs
pop ds
call inputnum
mov ah,9
lea dx,lfcr
int 21h
lea si,array
mov ch,0
mov cl,byte ptr[num]
mov ax,0
lp:add ax,word ptr[si]
daa ; 十進位制加法調整指令
inc si
inc si
loop lp
call dispnum
mov ah,4ch
int 21h
dispnum proc near
; 將要顯示的資料放入al中
mov dl,al ; 將al暫存在dl中
and al,0fh ; 取al的低4位
mov bl,al ; 非壓縮的bcd碼
add bl,30h ; 轉成ascii碼
mov al,dl ; 取回al 並經以下4次右移取出al的高4位
shr al,1
shr al,1
shr al,1
shr al,1
mov bh,al ; 非壓縮的bcd碼
add bh,30h ; 轉成ascii碼
mov ax,bx ; 非壓縮的兩位數的ascii碼存放在ax中
mov byte ptr[y+4],al
mov byte ptr[y+3],ah
mov ah,9
lea dx,y
int 21h
rety db 10,13,0,0,0,'$'
dispnum endp
inputnum proc near
; 輸入的資料以一個空格分隔,以回車符結束輸入
lea di,array ;將陣列第一個元素的有效地址置入di
mov byte ptr[num],0
stin:
mov ax,0
push ax
again1:
mov ah,1
int 21h
mov byte ptr[char],al
cmp al,13
je line0
cmp al,' '
je line0
sub al,30h
mov ah,0
mov si,ax
pop ax
mov cl,10
mov ch,0
mul cx
add ax,si
push ax
jmp again1
line0:
pop ax
mov word ptr[di],ax
inc byte ptr[num]
cmp byte ptr[char],13
je stinend
inc di
inc di
jmp stin
stinend:
retarray dw 100 dup(0)
num db 0
char db ?
inputnum endp
code ends
end start
請注意inputnum子程式,在開始部分執行了 push ax,就是為了儲存暫存器ax的值,因為在int 21h中斷子程式中要用ax進行入口引數設定。
7樓:匿名使用者
用於快取資料,保護暫存器或者進行暫存器與暫存器間資料傳輸。而且有些暫存器的值只能通過堆疊操作完成。比如程式暫存器的值cs只能通過堆疊操作完成讀取:
push cs
pop bx; 或者 pop ds之類。
也用於子函式(子例程,通過call指令呼叫)的引數傳遞。
call _sub
_sub: push ax ; 儲存axpush bx ; 儲存bx
mov ax, 128; 因為下面會改寫這兩個暫存器mov bx, 125;
.... ; 進行相關功能操作pop bx ; 完成後恢復bx值pop ax ; 完成後恢復ax值ret
8樓:娃哈哈ab鈣奶
push ds ;把ds壓入棧中
sub ax, ax ;ax—ax 結果存放在ax中,就是把0放在ax中
push ax ;把ax壓入棧中
mov ax, dat ;把dat段地址放到ax中mov ds, ax ;把ax值放到ds中pop入棧是把資料壓入棧段中;push出棧是把資料從棧段中拿出來;入棧與出棧是遵循先進後出的原則!入棧出棧其實是個臨時儲存資料作用!ss指向棧段的段地址,sp指向棧段的頂端。
希望我的回答對您有幫助,呵呵!
9樓:做而論道
以上的回答,全都是錯誤的。
樓主的所問的這些指令:
push ds
sub ax, ax
push ax
具有特定的含義,是不能簡單的解釋為:保護資料。
這幾句,是和 dos 作業系統配合使用的。
這幾句,是為了正確結束應用程式,而編寫的。
組合語言中的棧,壓棧,出棧是什麼意思
10樓:匿名使用者
就像一個裝乒乓球的盒子,只有一個口能開啟
裡面一個球不放,就是空棧
往裡面放一個球,就是壓棧
從裡邊拿一個球,就是出棧
都放滿了,就是滿棧,再放就會溢位
11樓:匿名使用者
棧就是分配的一些連續的記憶體空間 注意是連續的壓棧就是把一個資料放到棧中的頂部,然後依次往上疊,就和疊一堆書一樣出棧就是把棧頂部的資料拿出來,就像是把一疊書的最上面的一本拿出來一樣
12樓:匿名使用者
說的通俗點,就是一個資料的儲存與讀取。棧是個儲存器,壓棧就是往裡面存資料,出棧就是取資料
彙編 請問 如果把 " greeting! \r\n" 壓入棧中 push了多少bytes?
13樓:匿名使用者
pop指令bai本身並不會造成cs和ip跳到du別的地方,它只zhi是單純地起到dao
將ss:sp所指的內記憶體內容送入你指定容的目的地址並同時修改sp的值的作用。你的程式會跳到別處,是因為你在其它地方使用堆疊的時候,比如子程式中最後的ret,由於你堆疊資料關係錯位,導致返回時沒有能獲得當初你call時壓入堆疊的正確的返回地址,而將別的錯誤的數當成了返回地址的原因。
一般說來,使用堆疊時,必須由程式設計者自己考慮好堆疊裡的資料是如何使用的,要通過程式指令的運用,保證你彈出的是你需要的那個數,而不是別的數。這就要求在使用堆疊時應當push進一個就對應pop出棧一個(我稱它為平衡操作),且必須是先進的數後出。建議你在分析程式執行時自己畫一個堆疊中資料內容的示意圖進行分析,搞清楚指令執行過程中每個時刻當前的棧頂在**,棧裡有哪些資料,它們如何變化,這樣就不容易亂了。
組合語言中,出棧後 出棧的那個數值在棧中會被清零嗎?
14樓:匿名使用者
不會被清零。
組合語言中,出棧是通過pop指令來實現的,首先看一下intel手冊中對於pop指令的描述:
大致意思如下:pop指令從棧頂載入值到目標運算元指定的位置,然後增加棧頂指標。目標運算元可以是一個通用暫存器,記憶體位置或者段暫存器。
可以看到,手冊中並沒有提到出棧後pop要清空原有位置的值。因為這是不必要的,正常使用棧的話,出棧後那個位置的數值對棧沒有影響,在棧增長後,那個位置可能會被新的值覆蓋掉(即通過push壓棧),所以沒有必要清空它。而且,處理器和指令集設計的時候,必然會十分注重效率,不會做多餘的事情,清不清零對棧的使用完全沒有影響,所以設計師當然也不會讓pop做這件事。
15樓:匿名使用者
組合語言中,出棧後 出棧的那個數值在棧中 不會 被清零,
但是 如果有 新的 壓棧操作(入棧),會被新的資料替代。
16樓:匿名使用者
不會被清零,但是這個資料正常情況下不會被訪問到,除非特意去訪問這個資料
彙編指令按運算元個數怎麼分類,彙編指令,INC指令的運算元都可以是什麼
呵呵 俺來為你解答吧 1 彙編指令 由於cpu不同 其指令中的運算元的數目也是略有不同的 指令中可以無運算元 如nop 空操作指令 也可以有一個運算元 即叫單目運算元 inc bx 也可以有2個運算元 叫做雙目運算元 mov 2000h 1234 最多的彙編指令 也可以有3個運算元 叫做3目運算元 ...
軟體破解常用匯編指令有哪些,彙編中的常見指令有哪些
最近看了些軟體破解和漢化的文章,這 裡把我在學習中的一些基礎知識和大家分享下版 希望對你有所權幫助 cmp a,b 比較a與b mov a,b 把b值送給a值,使a bret 返回主程式 nop 無作用,英文 no operation 簡寫,意思 do nothing 機器碼90 ultraedit...
8086彙編條件轉移指令問題
等於就無所謂了。關鍵是大於與高於 小於與低於的區別。大於 小於用於有符號數比較的條件轉移,大於用jg,小於用jl 高於 低於用於無符號數比較的條件轉移,大於用ja,小於用jb。無論是有符號數比較還是無符號數比較,涉及到等於的,在條件轉移指令裡面加上一個 e 便是。如jge jbe jae jle等。...