組合語言 int指令代替 loop指令

2021-09-29 17:26:03 字數 1330 閱讀 7940

問題:使用7ch中斷例程完成loop指令的功能

loop 指令的功能:(1)判斷cx值是否為0

(2)不是則跳轉到標號s處

應用舉例:在螢幕中間顯示80個『 !』

assume codesg

codesg segment

start: mov ax,0b800h

mov es,ax

mov di,160*12

mov bx,offset s - offset se ;注意這裡使用標號s的偏移位址減去標號se的偏移位址

mov cx,80

s: mov byte ptr es,[di],'!'

add di,2

mov ax,4c00h

int 7ch

se:nop

mov ax,4c00h

int 21h

codesg ends

end start

;7ch中斷例程如下

lp: push bp

mov bp,sp

dec cx

jcxz lpret

add [bp+2],bx

lpret: pop bp

iret

解釋:

(1)進入中斷例程時 先要pushf 再 push cs 然後 push ip,由此可知棧中資料的存放順序

(2)中斷例程執行完成 使用iret指令還原 標誌暫存器 cs ip 即 pop ip / pop cs / popf

(3) int 7ch引發中斷過程後,進入中斷例程,在中斷過程中,當前的標誌暫存器、cs和ip都要壓棧,此時壓入的cs和ip中的內容,分別是呼叫程式的段位址(可以認為是標號s的段位址)和int 7ch後一條指令的偏移位址(即標號se的偏移位址)

可見,在中斷例程中,可以從棧中取得標號s的段位址和標號se的偏移位址,而用標號se的偏移位址加上bx中存放的轉移位移(這裡bx中的值為負數)就可以得到標號s的偏移位址

(4) 可以利用iret指令,設定cs:ip 就是說 只要將棧中的cs和ip值修改為標號s處的cs和ip 然後再用iret指令 就可以將cs:ip指向標號s的位址

(5)根據 先要pushf 再 push cs 然後 push ip 可得 棧中存放的資料的順序為 棧頂處為ip 下面是cs 再下面是 flag值

(6)mov bp,sp 得到棧頂位置,add [bp+2],bx 將佔中的ip加上轉移位移 即標號s處的偏移位移 注意 沒有顯示說明段暫存器是 bp對應的預設暫存器為ss

(7) iret 指令 等價於 pop ip / pop cs / popf 就是說 iret指令 同時設定了cs ip flag的值

組合語言 筆記 BX 和loop指令

符號mov ax,bx inc bx 功能 bx中的內容加1 loop指令的格式為 loop 標號 cpu執行loop指令時,進行兩步操作 程式設計計算2 12 assume cs code code segment mov ax,2 mov cx,11 s add ax,ax loop s mov...

組合語言04 BX 和loop指令

整理自fishcc論壇課件 首先展示乙個新的程式 assume cs codesg codesg segment start mov ax,2000h mov ds,ax mov al,0 mov bl,1 mov cl,2 mov dl,3 mov ax,4c00h int 21h codesg ...

彙編 組合語言實現氣泡排序 loop指令實現

1 2 迴圈程式設計3 loop指令實現4 氣泡排序5 for int i 0 i6 for int h 0 j j 10 11 12datas segment 13 buffer db 12,3,6,23,54,121,99,100,46,23 待排序的10個數 14datas ends 15co...