3 回答

TA貢獻1943條經驗 獲得超7個贊
在這里RET指令的內部操作是:棧頂字單元出棧,其值賦給IP寄存器。即實現了一個程序的轉移,將棧頂字單元保存的偏移地址作為下一條指令的偏移地址。
看這段代碼不難發現,程序從start后面的語句開始,用mov ax,0指令,讓(ax)=0,然后push ax,即讓棧頂字單元的值為0。所以ret執行后,(IP)=0,但是CS值不變,即CS一直指向code segment這個段(這個功能是通過assume cs:code實現的),程序轉移到code segment段的開頭的第一條語句,即mov ax,4c00h,然后調用int 21h結束程序。
mov bx,0這一步嘛,可以理解為這段代碼的具體功能就是讓bx清零。
補充說明一下:返回指令分為兩種,近返回和遠返回。
近返回的指令就是ret,內部操作為只出棧一個字單元,只改變IP的值。
遠返回的指令是retf,內部操作為連續出棧兩個字單元,分別改變IP和CS的值。
這段代碼用的是近返回,只改變了IP的值。

TA貢獻1804條經驗 獲得超8個贊
我看你的題目應該是x86下的16位匯編吧,那我就說說我的想法:
PC是程序計數器,存放下一個指令的地址值,它的體現也就是匯編代碼中的IP,IP寄存器是指令指針寄存器,注意不是指令寄存器IR?。?!初學者總容易搞混他們?。?!
首先計算機執行指令,要先根據PC中存放的指令地址,將指令由內存取到指令寄存器中,同時,PC中的地址要么自動加1(這個加1不是真正的數值加1,而是根據剛才執行的具體指令換算成實際的16進制長度,不同的指令對應機器碼長度不同),要么由轉移指針給出下一條指令的地址。
RET指令則是將棧頂(sp寄存器中的值就是棧頂)的返回地址彈出到IP,然后按照IP此時指示的指令地址繼續執行程序。
- 3 回答
- 0 關注
- 257 瀏覽
添加回答
舉報