組合語言檢測點13 1詳細解析

2021-10-05 06:53:40 字數 2005 閱讀 2775

建議先自己思考問題的答案,不懂則返回看書

7ch中斷例程如下:

;bx表示兩標號之間的轉移位移

lp: push bp

mov bp,sp

dec cx

jcxz lpret

add [bp+2],bx

lpret:

pop bp

iret

1、在上面的內容中,用7ch中斷例程實現loop的功能,則上面的7ch中斷例程所能進行的最大轉移位移是多少?此題存在幾個困惑的點,仁者見仁,智者見智,以下僅為我自己的觀點看法,敬請指正。

首先,在上面的例程中,模擬實現的是loop功能。此外,只有add [bp+2],bx指令可以進行 『較大』 位移,更細點來看,只有bx的值可以改變位移,具體分析如下:

(1)、此中斷例程實現的是 loop 功能,而 loop 是短轉移指令,範圍為 [-128,+127], 所以從這個角度來看,最大轉移位移是128.

(2)、bx的角度來看,若視bx為有符號數,則bx的範圍為 [-32768,+32767] , 此時最大轉移為32768;若視bx為無符號數,則bx的範圍為 [0,65535], 此時最大轉移為65535.

當然針對上述疑問,在dosbox中測試幾組資料便可得知。而顯示結果是此例程的轉移位移是 65535 。當然這只是我的結論,每個人都有自己的見解,仁者見仁智者見智。

2、用7ch中斷例程完成jmp near ptr s指令功能,用bx向中斷例程傳送轉移位移。

應用舉例:在螢幕的第12行,顯示data段中以0結尾的字串。

assume cs:code

data segment

db 'conversation',0

data ends

code segment

start:

mov ax,cs

mov ds,ax

mov si,offset cst

mov ax,0

mov es,ax

mov di,200h

mov cx,offset ce - offset cst

cldrep movsb

mov ax,0

mov es,ax

mov word ptr es:[7ch*4],200h

mov word ptr es:[7ch*4+2],0

mov ax,data

mov ds,ax

mov si,0

mov ax,0b800h

mov es,ax

mov di,12*160+35*2

s: cmp byte ptr [si],0

je ok

mov al,ds:[si]

mov es:[di],al

inc si

add di,2

mov bx,offset s - offset ok

int 7ch

ok: mov ax,4c00h

int 21h

cst:

push bp

mov bp,sp

add [bp+2],bx

pop bp

iret

ce: nop

code ends

end start

此**在dosbox下的執行結果截圖:

《組合語言》檢測點13 1

1 在上面內容中,我們用7ch中斷例程實現loop的功能,則上面的7ch中斷例程所能進行的最大轉移位移是多少?在7ch中斷例程中,位移的轉移是通過bx中儲存的offset來實現的,因此,理論上來說,最大轉移位移取決於bx中資料的大小,而bx是乙個16位的暫存器,最大值為65535。2 用7ch中斷例...

組合語言檢測點11 1詳細解析

建議先自己思考問題的答案,不懂則返回看書 分析 zf 記錄結果是否為零。結果為零,則zf為1 結果為1,則zf為0 pf 記錄結果中二進位制形式下1的個數是否為偶數。若1的個數是偶數,則pf 1 若1的個數是奇數,則pf 0 sf 記錄結果是否為負。若結果為負,則sf 1 若結果非負,則sf 0 注...

組合語言檢測點11 4詳細解析

建議先自己思考問題的答案,不懂則返回看書 下面的程式執行後 ax 析 pushf 和 popf 是對標誌暫存器的操作指令,本質上還是對資料的操作,標誌暫存器是16位,與通用暫存器 ax,bx 不一樣的是它是按 位 起作用的,即每一 位 都有它自己的含義,而通用暫存器整體表示乙個含義。具體分析 mov...