assume cs:code
code segment
start:
編寫**區
mov bx,0
mov ax,30
sub cx,1
mov ax,4c00h
int 21h
如果要想使得沒執行一行**,都列印偏移位址,那麼我們首先會考慮用到單步中斷。
(1)cpu執行 int 指令過程:
a.取中斷型別
b.標誌暫存器入棧,if tf置0
c.cs ip入棧
d.(ip)=(n* 4),(cs) = (n* 4+2)
(2)當tf = 1時,cpu在執行完一條指令後將引發單步中斷,轉去執行中斷處理程式。
所以,我們需要在單步中斷程式中將標誌暫存器中的tf位置1,這樣當第一次手動呼叫int 1之後,在每次命令執行之前,標誌暫存器內的tf都為1,這樣每次都能執行單步中斷,除非遇到 int 呼叫別的中斷,這樣會將tf置0.
(3)我們要先搞清楚,cpu在執行指令的時候ip位址是如何變化的,經過之前的學習,我們了解到: 當當前指令放入指令快取器內還沒有執行的時候,此時的ip已經自動增加到下乙個指令的ip處。所以我們呼叫 int 1 時,不會列印int 1的偏移位址,是從它之後的指令開始列印。
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset int1
mov di,200h
mov ax,0
mov es,ax
mov cx,offset int1end-offset int1
cldrep movsb
mov ax,0
mov es,ax
mov word ptr es:[4*1h],200h
mov word ptr es:[4*1h+2],0
mov di,160*12
int 1
mov bx,0
mov ax,30
sub cx,1
mov ax,4c00h
int 21h
int1: jmp short int1s
db"0123456789abcdef"
int1s:
push bp
mov bp,sp
push ax
push bx
push cx
mov ax,[bp+6] //此處是存放標誌暫存器的位置
or ah,00000001b //將tf位置1,實現單步中斷
mov [bp+6],ax
mov ax,[bp+2] //取出ip位址到ax,為了後面注釋好理解 例如ip = 1234h
call show
pop cx
pop bx
pop ax
pop bp
iret
show: push bx
push es
push dx
push cx
mov bl,ah //取出12h賦給bl,然後右移,取到數值1
mov cl,4
shr bl,cl
and ah,00001111b //將12h進行與運算,取到數值2
mov bh,0
mov bl,cs:[bx+202h] //202h對應的正好是中斷程式給出的字串0-f,將『1』字元取出
mov dx,0b800h
mov es,dx
mov es:[di+40*2],bl //列印
mov bl,ah //將02h賦給bl,之後用bx在1-f中查詢對應的字元『2』
mov bh,0
mov ah,cs:[bx+202h]
mov es:[di+41*2],ah
mov ah,al //取出34h賦給ah,然後右移,取到數值3
shr ah,cl
and al,00001111b //將12h進行與運算,取到數值4
mov bl,ah //之後的思路同上
mov bh,0
mov ah,cs:[bx+202h] //列印3
mov es:[di+42*2],ah
mov bl,al
mov bh,0
mov al,cs:[bx+202h] //列印4
mov es:[di+43*2],al
add di,160
pop cx
pop dx
pop es
pop bx
retint1end: nop
code ends
end start
組合語言 《組合語言》王爽 實驗一
從 1000 0 開始寫入命令 a 1000 0 mov ax,4e20 add ax,1416 mov bx,2000 add ax,bx mov bx,ax add ax,bx mov ax,001a mov bx,0026 add al,bl add ah,bl add bh,al mov a...
組合語言 王爽 實驗4
這學期在學彙編,沒怎麼自己動手程式設計過,結果到了中期編不出程式來,實在太尷尬了 特此來補各個實驗。4 11 0 200 0 20b 為什麼等同於 0020 0 0020b?0 200 0x16h 200 00200h 所以拆分成不同的形式即可轉換 assume cs code code segme...
《組合語言》 王爽 實驗11
題 編寫乙個子程式,將包含任意字元,以0結尾的字串中的小寫字母轉變成大寫字母,描述如下。名稱 letterc 功能 將以0結尾的字串中的小寫字母轉變成大寫字母。引數 ds si指向字串首位址。如題,任意字元,就得考慮一些其他字元,這就需要劃分乙個範圍,就是取出的字元應該在小寫字母的ascii碼範圍內...