一、實驗目的
- 理解和掌握轉移指令的跳轉原理
- 掌握使用call和ret指令實現子程序的方法,理解和掌握其參數傳遞方式
- 理解和掌握80×25彩色字符模式顯示原理
- 綜合應用尋址方式和匯編指令完成簡單應用編程
二、實驗准備
復習教材9-10章:
- 轉移指令的跳轉原理
- 匯編指令jmp, loop, jcxz, call, ret, retf的用法
三、實驗內容
1. 實驗任務1
實驗的源碼以及編譯運行結果
-
task1源碼
assume cs:code, ds:data data segment x db 1, 9, 3 len1 equ $ - x y dw 1, 9, 3 len2 equ $ - y data ends code segment start: mov ax, data mov ds, ax mov si, offset x mov cx, len1 mov ah, 2 s1:mov dl, [si] or dl, 30h int 21h mov dl, ' ' int 21h inc si loop s1 mov ah, 2 mov dl, 0ah int 21h mov si, offset y mov cx, len2/2 mov ah, 2 s2:mov dx, [si] or dl, 30h int 21h mov dl, ' ' int 21h add si, 2 loop s2 mov ah, 4ch int 21h code ends end start
-
編譯連接的結果
-
問題1
loop s1
反匯編跳轉的位移是F2,-14,F2是14的補碼cpu讀取了
loop
指令之后IP變成001B,需要跳轉到000D,所以偏移量為-14 -
問題2
loop s2
指令的跳轉偏移地址是-16,F0(補碼)IP讀取完loop指令之后,偏移地址為0039H,跳轉的偏移地址是0029H,所以偏移量為-16
2.實驗任務2
-
task2.asm源碼
assume cs:code, ds:data data segment dw 200h, 0h, 230h, 0h data ends stack segment db 16 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov word ptr ds:[0], offset s1 mov word ptr ds:[2], offset s2 mov ds:[4], cs mov ax, stack mov ss, ax mov sp, 16 call word ptr ds:[0] s1: pop ax call dword ptr ds:[2] s2: pop bx pop cx mov ah, 4ch int 21h code ends end star
-
給出分析、調試、驗證后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上調試結果界面截圖。
編譯結果:
1.ax寄存器的值為21H,bx寄存器的值為26H,cx寄存器的值為076C、
call指令會將ip的地址入棧,所以出棧的是ip的存入地址,給ax
call dword會將cs:ip分別入棧,所以分別出棧賦給了cx,bx;
2和分析結果一致
3.實驗任務3
-
task3.asm源碼
assume cs:code, ds:data data segment x db 99, 72, 85, 63, 89, 97, 55 len equ $- x data ends code segment start: mov ax, data mov ds, ax mov cx,len mov si,0 s: mov ah,0 mov al,[si] mov bx,offset printnumber call bx#調用打印函數 mov bx,offset printSpace call bx#打印空格 inc si loop s mov ah, 4ch int 21h printnumber: mov bl,10#分離個位數和十位數 div bl mov bx,ax mov ah,2 mov dl,bl#打印商 or dl,30h#轉成字符 int 21h mov dl,bh#打印余數 or dl,30h#轉成字符 int 21h ret printSpace: mov ah,2 mov dl,' ' int 21h ret code ends end start
-
運行測試截圖
4.實驗任務4
-
task4.asm源碼
assume cs:code, ds:data data segment str db 'try' len equ $ - str data ends code segment start: mov ax, data mov ds, ax mov ax,0B800H mov es,ax mov si,offset printStr#第一次打印 mov ah,2#屬性顏色 mov bx,0#位移到第一行 call si mov si,offset printStr#第二次打印 mov ah,4 mov bx,0F00H#最后一行 call si mov ah, 4ch int 21h printStr: mov cx,len#打印三個字符 mov si,0 s: mov al,[si] mov es:[bx+si],ax inc si inc bx loop s ret code ends end start
-
運行測試截圖
5.實驗任務5
-
task5.asm源碼
assume cs:code, ds:data data segment stu_no db '201983290498' len = $ - stu_no data ends code segment start: mov ax, data mov ds, ax mov ax,0B800H mov es,ax mov cx,0780H;將除了最后一行的染成藍色 mov ah,10H mov al,' ' mov bx,0 s: mov es:[bx],ax add bx,2 loop s mov cx,80;打印最后一行橫線 mov ah,17H mov al,'-' s1: mov es:[bx],ax add bx,2 loop s1 mov cx,len;打印學號 mov bx,0F44H mov si,0 s2: mov al,[si] mov es:[bx],ax inc si add bx,2 loop s2 mov ah, 4ch int 21h code ends end start
-
運行測試截圖