實驗3 轉移指令跳轉原理及其簡單應用編程


一、實驗目的

  1. 理解和掌握轉移指令的跳轉原理
  2. 掌握使用call和ret指令實現子程序的方法,理解和掌握其參數傳遞方式
  3. 理解和掌握80×25彩色字符模式顯示原理
  4. 綜合應用尋址方式和匯編指令完成簡單應用編程

二、實驗准備

復習教材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
    
  • 編譯連接的結果
    image

image

  • 問題1

    loop s1反匯編跳轉的位移是F2,-14,F2是14的補碼

    cpu讀取了loop指令之后IP變成001B,需要跳轉到000D,所以偏移量為-14

    image

  • 問題2

    loop s2指令的跳轉偏移地址是-16,F0(補碼)

    IP讀取完loop指令之后,偏移地址為0039H,跳轉的偏移地址是0029H,所以偏移量為-16

    image


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) = ? 附上調試結果界面截圖。

    編譯結果

    image

    1.ax寄存器的值為21H,bx寄存器的值為26H,cx寄存器的值為076C

    call指令會將ip的地址入棧,所以出棧的是ip的存入地址,給ax

    call dword會將cs:ip分別入棧,所以分別出棧賦給了cx,bx;

    2和分析結果一致

image


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
    
  • 運行測試截圖

image


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
    
  • 運行測試截圖

image



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
    
  • 運行測試截圖

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM