实验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
- 运行测试截图






浙公网安备 33010602011771号