实验3 转移指令跳转原理及其简单应用编程

四、实验结论

1.实验任务1

  • task1.asm源码,及,运行截图

    源码:

    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
    

    运行截图:

  • 回答问题①

    位移量是-14。loop指令所在行的数据是E2F2,其中E2代表loop指令,F2代表位移量。F2是十六进制补码形式,对应十进制原码是-14。loop指令定义是当前IP+有符号偏移量=跳转地址,当前IP指向下一条指令的开始地址为001B,所以跳转地址为000D

  • 回答问题②

    位移量是-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 start
    
  • 分析、调试、验证后,寄存器(ax) = ?(bx) = ? (cx) = ? 附上调试结果界面截图。

    (ax)=0021 (bx)=0026 (cx)=076C

    word为短转移,把s1处的IP进栈,然后跳转到s1的地址。把s1处的IP值送入ax。
    dword为远转移,把s2出的CS:IP值进栈,然后跳转到s2处。把s2的IP值送入bx,s2 的CS值送入 cx。

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 '20192308060' 
    	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
    
  • 运行测试截图

五、实验总结(选)

posted @ 2021-11-28 13:47  幸福^_^灿灿  阅读(76)  评论(1编辑  收藏  举报