实验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 star
  • 运行截图

       

  •  问题1:loop s1指令的机器码是E2F2,其中F2就是转移的位移量的补码的形式。通过转换可以知道其原码是-14.所以其位移量就是-14。在执行汇编指令时loop s1,ip是0019,同时ip+2,此时ip是001BH,加上位移量-14后,其ip为000D,实现跳转。

 

  • 问题2:loop s2指令的机器码是E2F0,其中F0就是转移的位移量的补码的形式。通过转换可以知道其原码是-16.所以其位移量就是-16。在执行汇编指令时loop s2,ip是0037,同时ip+2,此时ip是0039H,加上位移量-16后,其ip为0029,实现跳转。
  •  

     

1. 实验任务2
  • 程序task2.asm源码
  •  1 assume cs:code, ds:data
     2 
     3 data segment
     4     dw 200h, 0h, 230h, 0h
     5 data ends
     6 
     7 stack segment
     8     db 16 dup(0)
     9 stack ends
    10 
    11 code segment
    12 start:  
    13     mov ax, data
    14     mov ds, ax
    15 
    16     mov word ptr ds:[0], offset s1
    17     mov word ptr ds:[2], offset s2
    18     mov ds:[4], cs
    19 
    20     mov ax, stack
    21     mov ss, ax
    22     mov sp, 16
    23 
    24     call word ptr ds:[0]
    25 s1: pop ax
    26 
    27     call dword ptr ds:[2]
    28 s2: pop bx
    29     pop cx
    30 
    31     mov ah, 4ch
    32     int 21h
    33 code ends
    34 end start
  • ax寄存器的值是s1代码段的起始地址,bx寄存器的值是s2代码段的起始地址。cx寄存器的值是cs的值。因为call word ptr 命令所做的操作是将当前IP压入栈中

        执行call word ptr ds:[0]时,ip为下一条指令的起始地址,即IP为s1代码段的起始地址。此时,将IP=0021压入栈中。随后指令跳转到ds:[0]存放的地址,即s1代码段,此时执行出栈操作,将栈中的0021赋值给ax。所以ax的值就是s1的起始地址。

       

 

         执行call dword ptr ds:[2]原理类似,只是此时,压入栈中的变为CS和IP,所以出栈时,先出栈IP,再出栈CS,即将IP的值赋给bx,将cs的值赋给cx。bx的值是s2代码起始地址的IP值,cx的值是s2代码段的cs值。

1. 实验任务3
  • 程序源码task3e3.asm
  •  1 assume cs:code, ds:data
     2 
     3 data segment 
     4     x db 99, 72, 85, 63, 89, 97, 55 
     5     len equ $- x 
     6 data ends
     7 
     8 stack segment
     9     db 16 dup(0)
    10 stack ends
    11 
    12 code segment
    13 start:  
    14     mov ax, data
    15     mov ds, ax
    16 
    17     mov si,offset x
    18     mov cx,7
    19    
    20 s:
    21     mov al,[si]
    22     mov ah,0
    23     call printNumber
    24     call printSpace
    25 
    26     inc si
    27     loop s
    28 
    29     mov ah, 4ch
    30     int 21h
    31 
    32 printNumber: 
    33     mov dl,10
    34     div dl
    35     mov dl,ah
    36     or dl,30h
    37     push ax
    38     mov ah,2
    39     int 21h
    40     pop ax
    41     
    42     mov dl,al
    43     or dl,30h
    44     mov ah,2
    45     int 21h
    46     ret
    47 
    48 printSpace: 
    49     mov dl,' '
    50     int 21h
    51     ret
    52 
    53     
    54 code ends
    55 end start

     

  • 运行测试截图
  •  

     

1. 实验任务4
  • 程序源码task4e3.asm
  •  1 assume cs:code, ds:data
     2 
     3 data segment 
     4     str db 'try' 
     5     len equ $ - str 
     6 data ends
     7 
     8 stack segment
     9     db 16 dup(0)
    10 stack ends
    11 
    12 code segment
    13 start:  
    14     mov ax, data
    15     mov ds, ax
    16 
    17     mov ax,0b800h
    18     mov es,ax
    19 
    20     mov si,offset str
    21     mov cx,len
    22     mov bl,2
    23     mov bh,0
    24     call printStr
    25     
    26     mov si,offset str
    27     mov cx,len
    28     mov bl,4
    29     mov bh,24
    30     call printStr
    31     
    32     mov ah, 4ch
    33     int 21h
    34 
    35 printStr: 
    36     mov al,bh
    37     push bx
    38     mov bl,160
    39     mul bl
    40     mov di,ax
    41     pop bx
    42   s:mov al,[si]
    43     mov es:[di],al
    44     mov es:[di+1],bl
    45     inc si
    46     add di,2
    47     loop s
    48     ret
    49  
    50    
    51     
    52 code ends
    53 end start

     

  • 运行测试截图
  •  

     

1. 实验任务5
  • 程序源码task5e3.asm
  •   1 assume cs:code, ds:data
      2 
      3 data segment 
      4     stu_no db '201983290155' 
      5     len = $ - stu_no 
      6 data ends
      7 
      8 stack segment
      9     db 16 dup(0)
     10 stack ends
     11 
     12 code segment
     13 start:  
     14     mov ax, data
     15     mov ds, ax
     16 
     17     mov ax,0b800h
     18     mov es,ax
     19 
     20     mov si,offset stu_no
     21     
     22     mov cx,24
     23     mov bl,0
     24 s4:
     25     call blue
     26     inc bx
     27     loop s4
     28 
     29     mov bl,4
     30     mov bh,24
     31     call prints1
     32     call printStr
     33     call prints2
     34     
     35     mov ah, 4ch
     36     int 21h
     37 blue:
     38     mov al,bl
     39     push cx
     40     mov cx,80
     41     push bx
     42     mov bl,160
     43     mul bl
     44     mov di,ax
     45     pop bx
     46 s3:mov al,' '
     47     mov es:[di],al
     48     mov byte ptr es:[di+1],00010111B
     49     add di,2
     50     loop s3
     51     pop cx
     52     ret
     53 prints1:
     54     mov al,bh
     55     push cx
     56     mov cx,34
     57     push bx
     58     mov bl,160
     59     mul bl
     60     mov di,ax
     61     pop bx
     62 s1:mov al,'-'
     63     mov es:[di],al
     64     mov byte ptr es:[di+1],00010111B
     65     add di,2
     66     loop s1
     67     pop cx
     68     ret
     69 prints2:
     70     mov al,bh
     71     push cx
     72     mov cx,34
     73     push bx
     74     mov bl,160
     75     mul bl
     76     mov di,ax
     77     add di,92
     78     pop bx
     79 s2:mov al,'-'
     80     mov es:[di],al
     81     mov byte ptr es:[di+1],00010111B
     82     add di,2
     83     loop s1
     84     pop cx
     85     ret
     86 printStr: 
     87     push cx
     88     mov cx,len
     89     mov al,bh
     90     push bx
     91     mov bl,160
     92     mul bl
     93     mov di,ax
     94     add di,68
     95     pop bx
     96   s:mov al,[si]
     97     mov es:[di],al
     98     mov byte ptr es:[di+1],00010111B
     99     inc si
    100     add di,2
    101     loop s
    102     pop cx
    103     ret
    104  
    105    
    106     
    107 code ends
    108 end start

     

  •  运行测试截图
  •  

     

posted @ 2021-11-26 10:58  『子休』  阅读(58)  评论(3)    收藏  举报