王爽組合語言 13章拓展實驗(個人筆記)

2021-10-06 21:47:57 字數 2426 閱讀 2929

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碼範圍內...