1樓:匿名使用者
不會被清零。
組合語言中,出棧是通過pop指令來實現的,首先看一下intel手冊中對於pop指令的描述:
大致意思如下:pop指令從棧頂載入值到目標運算元指定的位置,然後增加棧頂指標。目標運算元可以是乙個通用暫存器,記憶體位置或者段暫存器。
可以看到,手冊中並沒有提到出棧後pop要清空原有位置的值。因為這是不必要的,正常使用棧的話,出棧後那個位置的數值對棧沒有影響,在棧增長後,那個位置可能會被新的值覆蓋掉(即通過push壓棧),所以沒有必要清空它。而且,處理器和指令集設計的時候,必然會十分注重效率,不會做多餘的事情,清不清零對棧的使用完全沒有影響,所以設計師當然也不會讓pop做這件事。
2樓:匿名使用者
組合語言中,出棧後 出棧的那個數值在棧中 不會 被清零,
但是 如果有 新的 壓棧操作(入棧),會被新的資料替代。
3樓:匿名使用者
不會被清零,但是這個資料正常情況下不會被訪問到,除非特意去訪問這個資料
4樓:匿名使用者
出棧後 出棧的那個數值在棧中不會被清零 只是sp-1指向上乙個棧位址了
5樓:匿名使用者
不會清零。
pop dst 指令執行過程:
(dst)<-((sp)+1, (sp))(sp)<-(sp)+2
可見,棧中資料並無變化,只是sp指標+2。
6樓:匿名使用者
不會清零。不信的話到原位址去看看原數變了沒。
7樓:魔塔過客
出棧操作其實變的只是指標sp.....原數值仍舊保留
8樓:
不會,是原封不動的,所以說自動變數總是乙個隨機值,你每次宣告乙個自動變數,棧指標就會增加,新變數的值實際上是上一次使用該記憶體的變數值。。。
彙編出棧入棧的順序問題
9樓:匿名使用者
入棧的順序是:push ax push si出棧時:pop si pop ax
組合語言呼叫子程式位址入棧出棧情況
10樓:做而論道
子程式,應該稱為過程。
定義過程的時候,有 遠、近 的區別。
呼叫遠過程,就是段位址和偏移位址,都要入棧。
關於組合語言問題,入棧出棧什麼用
11樓:匿名使用者
組合語言中堆疊的操作有專門的語句指令。
入棧指令是: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碼轉換為十六進製制。
12樓:匿名使用者
保護資料用。就是將ds ax 裡的資料先暫存在堆疊裡,這就是入棧(指令為push)。然後,可以對它們進行操作而不會影響原來的資料。到需要原來的資料時,再出棧(pop) 。
13樓:匿名使用者
對於現代的計算機來說,棧是一種非常關鍵、極其重要的資料結構。
棧就相當於乙個細長的裝彈珠的瓶子(瓶口、瓶身內部截面均只能通過乙個彈珠),不同顏色的彈珠只能從瓶口裝入,也只能從瓶口取出,在瓶內的彈珠的順序是不能改變的。這些彈珠具有「先進後出、後進先出」的特性。瓶子有一定的長度,裝滿彈珠後就不能再裝了,再裝就直接滾跑了(溢位)。
程式不都是線性的,有分支、有迴圈,有主程式、也有子程式。在子程式中,棧通常用來儲存現場(進棧--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進行入口引數設定。
14樓:匿名使用者
用於快取資料,保護暫存器或者進行暫存器與暫存器間資料傳輸。而且有些暫存器的值只能通過堆疊操作完成。比如程式暫存器的值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
15樓:娃哈哈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指向棧段的頂端。
希望我的回答對您有幫助,呵呵!
16樓:做而論道
以上的回答,全都是錯誤的。
樓主的所問的這些指令:
push ds
sub ax, ax
push ax
具有特定的含義,是不能簡單的解釋為:保護資料。
這幾句,是和 dos 作業系統配合使用的。
這幾句,是為了正確結束應用程式,而編寫的。
組合語言壓棧出棧延時問題,組合語言中的棧,壓棧,出棧是什麼意思
壓棧並不改變r2的值,外層迴圈中djnz r2一次,r2就減1,而push 則就是保持這個值在delay3實現延時。組合語言中的棧,壓棧,出棧是什麼意思 就像乙個裝桌球的盒子,只有乙個口能開啟 裡面乙個球不放,就是空棧 往裡面放乙個球,就是壓棧 從裡邊拿乙個球,就是出棧 都放滿了,就是滿棧,再放就會...
彙編出棧入棧的順序問題,組合語言中入棧出棧問題
入棧的順序是 push ax push si出棧時 pop si pop ax 組合語言中入棧出棧問題 20 我們申請乙個空棧,然後把ax,b.你是怎麼申請的呀?你既然,申請了乙個空棧,你就應該知道,棧底,在什麼地方。也就知道,棧底,的位址,存在什麼地方。那麼你說說看,你把棧底的位址,存在什麼地方了...
關於組合語言問題入棧出棧什麼用,組合語言中入棧出棧問題
組合語言中堆疊的操作有專門的語句指令。入棧指令是 push 出棧指令是 pop 比如 mov a,30h 將乙個壓縮bcd碼送累加器apush acc 壓棧保護 anl a,0fh 保留低四位 mov 30h,a 回送給30h pop acc 出棧 swap a 高低四位互換 anl a,0fh 保...