实验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:

 

 跳转的位移量为   F2h   242

F2 h + 001B h =  010D h  舍弃溢出 01  得到跳转地址为000D h  

 

问题2

 

 跳转的位移量为  F0 h   240

F0 h + 0037 h =0129 h  舍弃溢出 01  得到跳转地址为0029 h 

 

实验任务二

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

 

问题1

call word  ptr 为短转移,将 s1的ip压入栈中, 所以pop ax=s1,

call dword ptr 为长转移, 所以将 cs  ip 压入栈中,所以 pop bx=s2, pop  cx=cs

问题2

 

 

 

结果与理论分析一致

 

实验任务三

 

 


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 si, offset x 
  mov cx, len
  mov bl, 10
s1:
  mov ah, 0
  mov al, [si]
  call printNumber
  call printSpace
  inc si
  loop s1

  mov ax, 4c00h
  int 21h

printNumber:
  div bl    ;div  商在al  余数在ah
  mov dl, al
  or dl, 30H;数字转字符
  mov bh, ah

  mov ah, 2
  int 21h;打印十位数
  
  mov dl, bh
  or dl, 30H  ;dl  输出内容,数字转字符
  int 21h

  ret


; 功能:输出单个字符
;mov ah, 2
;mov dl, ×× ; ××是待输出的字符,或其ASCⅡ码值
;int 21h

printSpace:
  mov ah, 2
  mov dl, ' '
  int 21h  ;输出空格
  ret

code ends
end start

 

 

 

 

 

 试验任务四

 

 

 

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 str
    mov bh, 0  ;
    
    
    mov ax, 0
    mov bl, bh
    mov bh, 0
    mov cx, bx
s1:
    add ax, 00A0h
    loop s1
    mov di, ax
    
    
    mov bl, 2  ;颜色
    call printStr
    
    
    mov si, offset str
    mov bh, 24
    
    mov ax, 0
    mov bl, bh
    mov bh, 0
    mov cx, bx
s2:
    add ax, 00A0h
    loop s2
    mov di, ax
    
    mov bl,4
    call printStr
    
    
    
    mov ax, 4c00h
    int 21h


printStr:
    mov cx, len
s:
    mov ah, bl          ;颜色
    mov al, [si]         ; 字符
    mov es:[di], ax      ;输出
    inc si
    add di, 2
    loop s
    
    ret

code ends
end start

 

 

 

 

 

 

 实验任务五

 

 

 

assume cs:code, ds:data

data segment
    stu_no db '201983290112'
    len = $ - stu_no
data ends

code segment
start:

    mov ax, data
    mov ds, ax
    mov ax, 0b800h
    mov es,ax


    mov bh, 0

    mov ax, 0          ;设置行首  di 
    mov bl, bh        ;  00A0h * bx
    mov bh, 0
    mov cx, bx
s1:
    add ax, 00A0h
    loop s1
    mov di, ax   ;di
    
    
    mov bl, 17h    ;设置颜色  00010111

    mov cx, 2000  ;25*80
s2:
    mov al, ' '
    mov ah, bl
    mov es:[di], ax
    add di, 2
    loop s2
    
    
    
    
    mov si, offset stu_no
    mov bh, 24  ;
    
    mov ax, 0
    mov bl, bh
    mov bh, 0
    mov cx, bx

s3:
    add ax,00A0h
    loop s3
    mov di, ax
    
    
    mov bl, 17h  
    
    call printStr


    
    mov ax, 4c00h
    int 21h
    
    
printStr:
    call print

    mov cx, len
s4:
    mov ah, bl
    mov al, [si]

    mov es:[di], ax
    inc si
    add di, 2
    loop s4

    call print
    ret
 
 
print:
    mov cx, 34
s5:
    mov ah, bl
    mov al, 45;'-'
    mov es:[di], ax
    add di, 2
    loop s5
    ret
    
    

code ends
end start

 

 

 

posted @ 2021-11-28 18:30  Wknfy  阅读(51)  评论(2)    收藏  举报