一道組合語言題,望一步一步解釋下出棧和入棧到底是怎麼進行的

2021-04-18 09:15:50 字數 4976 閱讀 5490

1樓:重行動

更具從上bai到下的順序,如下:du

第一步將zhieax(123456)壓入棧頂dao;內又將ax壓入棧頂;

出棧資料到容bx(ax);

將ebx(01020304)壓入棧,此時是第二層;

又將cx壓入棧(三層);

出棧資料到eax(cx);

出棧資料到cx(01020304);

各暫存器值eax(cx);(ebx)=01020304h ;(ecx)=05060108h ;sp(2000h-1);ax不變;

bx(ax);cx(01020304h)

組合語言中在程式開頭為什麼要暫存器入棧,求詳細解釋一下,謝謝

2樓:匿名使用者

1樓的說得對 進入中斷自己還要(自己保護現場)儲存狀態暫存器 bank區(ram區) acc(累加器) 定址指標 .並且中斷裡少用call 子程式 和延時太久 call 太多會造成堆疊溢位 中斷裡延時太久會造成實時的誤差 比如你在裡面延時的2s 實時就會誤差1.5s 且出中斷要恢復(現場)進入中斷時的狀態暫存器 。

bank區 定址指標 acc值最後寫.(否則會改變它的值)

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

org 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 作業系統配合使用的。

這幾句,是為了正確結束應用程式,而編寫的。

組合語言中入棧出棧問題 20

10樓:做而論道

我們申請乙個空棧,然後把ax,b....

--你是怎麼申請的呀?

-----------------

你既然,申請了乙個空棧,

你就應該知道,棧底,在什麼地方。

也就知道,棧底,的位址,存在什麼地方。

那麼你說說看,你把棧底的位址,存在什麼地方了?

然後,你又把ax,bx 的內容,存在什麼地方了?

這個事情,你要是不知道,那就奇怪了!

這就又回到原來的問題:--你是怎麼申請的呀?

呵呵,你真能瞎琢磨。

11樓:匿名使用者

push ax

push bx

pop bx<- pop是 把棧裡面的數,彈出到bxpo ax<-

12樓:匿名使用者

位址在ss:sp裡.

走一步,再走一步文章的第四題答案

1.傑利明明知道我抄的身體情況bai,但他不是想乘機捉du弄我,而是想讓我的膽子更大zhi些dao。傑利出於好意,但沒有顧及到結果。2.我落在最後,全身顫抖,冷汗直冒,也跟這他們向上爬。我的心在瘦骨嶙峋的胸腔裡咚咚直跳。我看在眼裡,嚇得幾乎暈倒。我終於爬了上去,蹲在石架上,心驚肉跳,盡量往裡靠。我聽...

一道數學題,要有詳細過程,每一步必須有解釋快

我不是他舅 13拆成4 9 則 x 6x 9 y 4y 4 0所以 x 3 y 2 0 平方大於等於0,相加等於0,若有一個大於0,則另一個小於0,不成立所以兩個都等於0 所以x 3 y 2 0 x 3,y 2 x y 1 所以原式 1 x 2 y 2 6x 4y 13 0 x 2 6x 9 y 2...

vs2019用C語言如何一步一步做個登陸介面出來?包括頁面

你裝vs2010年吧,那裡面只有有登入的demo,直接可以使用。連線資料庫 if 資料庫是否有該username else 錯誤 username vs2005 c 語言 模板時win應用程式,我做了兩個介面但是都是form1,這樣我怎麼用乙個介面呼叫另乙個 同乙個解決方案下,不可能是重名的,建議你...