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

 

 

实验一

 

实验源码

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】

 F2是补码形式的偏移量,即11110010,其原码为10001101+1=10001110【补码->原码,负数时,后七位取反+1】,因此偏移量为-14,此时IP为001B,二进制为27,所以27-14=13,loop0D

【问题2】

 F0为16进制的补码,11110000,原码为10001111+1=10010000,即为-16,IP=0039为3*16+9=57,57-16=41,所以loop 29.

实验二

【实验源码】

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  ;s1地址放入ds[0]
   mov word ptr ds:[2], offset s2  ;s2地址放入ds[2] 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

用debug进行跟踪确认,“call 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令。

 

 ax=s1的IP,bx=s2的IP,cx=s2的CS

实验三

【实验代码】

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 byte ptr ds:[len],10
    mov cx,7
    mov bx,0
s:  mov al,ds:[bx]
    mov ah,0
    inc bx
    call printNumber
    call printSpace
    loop s
    mov ah,4ch
    int 21h
printNumber:
    div byte ptr ds:[len]
    mov dx,ax
    mov ah,2
    or dl,30h
    int 21h
    mov ah,2
    mov dl,dh
    or dl,30h
    int 21h
    ret
printSpace:
    mov dl,' '
    mov ah,2
    int 21h
    ret
code ends
end start

 

【实验截图】

 

 实验四

【实验代码】

assume cs:code, ds:data

data segment
    string db 'try'
    len equ $ - string
data ends

code segment
start:
    mov ax,data
    mov ds,ax

    mov si,0
    mov cx,len
    mov bl,2
    mov bh,0
    call printStr

    mov si,0
    mov cx,len
    mov bl,4
    mov bh,24
    call printStr

    mov ah,4ch
    int 21h

printStr:
    mov ax,0b800h
    mov es,ax
    mov ax,0
    mov al,bh
    mov dx,160
    mul dx
    mov di,ax
    s:   
        mov al,ds:[si]
        mov es:[di],al
        inc si
        inc di
        mov es:[di],bl
        inc di
        loop s
    ret
code ends
end start

 

【实验截图】

 

 实验五

【实验代码】

assume cs:code, ds:data

data segment
    stu_no db '201983290052'
    len = $ - stu_no
    len1 = (80-len)/2
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    
    mov bl,16
    call printColor

    mov si,0
    mov bl,23
    mov bh,24
    call printStr
    mov ah,4ch
    int 21h

printColor:
    mov ax,0b800h
    mov es,ax
    mov ax,0
    mov al,25
    mov dx,0
    mov dx,80
    mul dx
    mov cx,ax
    mov al,' '
    mov di,0
    s:    mov es:[di],al
        inc di
        mov es:[di],bl
        inc di
        loop s
    ret

printStr:
    mov ax,0b800h
    mov es,ax
    mov ax,0
    mov al,bh
    mov dx,160
    mul dx
    mov di,ax

    mov al,'-'
    mov cx,len1
    s1:    mov es:[di],al
        inc di
        mov es:[di],bl
        inc di
        loop s1
    
    mov cx,len
    s2:    mov al,ds:[si]
        mov es:[di],al
        inc si
        inc di
        mov es:[di],bl
        inc di
        loop s2

    mov al,'-'
    mov cx,len1
    s3:    mov es:[di],al
        inc di
        mov es:[di],bl
        inc di
        loop s3
    ret
code ends
end start

 

【实验截图】

 

posted @ 2021-12-02 14:46  Blessings  阅读(82)  评论(3)    收藏  举报