实验3 转移指令跳转原理及其简单应用编程
1.实验任务1
task1.asm源码如下:
1 assume cs:code, ds:data 2 3 data segment 4 x db 1, 9, 3 5 len1 equ $ - x 6 7 y dw 1, 9, 3 8 len2 equ $ - y 9 data ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov si, offset x 17 mov cx, len1 18 mov ah, 2 19 s1:mov dl, [si] 20 or dl, 30h 21 int 21h 22 23 mov dl, ' ' 24 int 21h 25 26 inc si 27 loop s1 28 29 mov ah, 2 30 mov dl, 0ah 31 int 21h 32 33 mov si, offset y 34 mov cx, len2/2 35 mov ah, 2 36 s2:mov dx, [si] 37 or dl, 30h 38 int 21h 39 40 mov dl, ' ' 41 int 21h 42 43 add si, 2 44 loop s2 45 46 mov ah, 4ch 47 int 21h 48 code ends 49 end start
运行截图:
回答下列问题:
① line26, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。
从反汇编截图来看,cpu收到loop
指令之后IP变成001B,需要跳转到000D,后者减去前者得偏移地址为-14
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。
从反汇编截图来看,cpu收到loop
指令之后IP变成0039H,需要跳转到0029H,后者减去前者得偏移地址为-16
2.实验任务2
task3_2源码如下:
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
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) =
? 寄存器(bx) = ? 寄存器(cx) = ?
ax = s1偏移地址 bx = s2偏移地址 cx = s2所在段的段基址
call word ptr ds:[0] 将下一条指令ip入栈, 并转移至 ds:[0]地址即 s1 处, 接着pop出栈给ax;
call dword ptr ds:[2] 将下一条指令cs和ip压入栈, 并转移至 s2 处, 接着 pop bx 将ip出栈给ax, pop cx 将 cs 出栈给 cx.
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试
结果与理论分析结果是否一致。
结果一致
3.实验任务3
源码如下:
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 code segment 9 start: mov ax,data 10 mov ds,ax 11 mov cx,len 12 mov si,0 13 14 s: mov ah,0 15 mov al,[si] 16 call printnumber #调用打印函数 17 call printspace #打印空格 18 inc si 19 loop s 20 21 mov ah, 4ch 22 int 21h 23 24 printnumber:mov bl,10 #分离个位数和十位数 25 div bl 26 mov bx,ax 27 28 mov ah,2 29 30 mov dl,bl #打印商(十位) 31 or dl,30h #转成字符 32 int 21h 33 34 mov dl,bh #打印余数(个位) 35 or dl,30h #转成字符 36 int 21h 37 ret 38 39 printspace:mov ah,2 40 mov dl,' ' 41 int 21h 42 ret 43 44 45 code ends 46 end start
结果截图:
4.实验任务4
源码如下:
1 assume cs:code, ds:data 2 3 data segment 4 str db 'try' 5 len equ $ - str 6 data ends 7 8 code segment 9 main: 10 mov ax,data 11 mov ds,ax 12 mov ax,0B800H 13 mov es,ax 14 15 first_print: 16 mov si,offset printStr 17 mov ah,2 #属性颜色 18 mov bx,0 #位移到第一行 19 call si 20 21 second_print: 22 mov si,offset printStr 23 mov ah,4 24 mov bx,0F00H #位移到最后一行 25 call si 26 27 mov ah, 4ch 28 int 21h 29 30 printStr: 31 mov cx,len #字符 32 mov si,0 33 34 s: 35 mov al,[si] 36 mov es:[bx+si],ax 37 inc si 38 inc bx 39 loop s 40 ret 41 42 code ends 43 end main
结果截图:
5.实验任务5
源码如下:
1 assume cs:code, ds:data 2 3 data segment 4 stu_no db '201983290102' 5 len = $ - stu_no 6 data ends 7 8 code segment 9 main: 10 mov ax, data 11 mov ds, ax 12 mov ax, 0b800h 13 mov es, ax 14 mov si, offset stu_no 15 mov di, 0 16 mov bl, 17h 17 call printColor 18 call printLine 19 call printNumber 20 call printLine 21 mov ah, 4ch 22 int 21h 23 24 25 printColor: 26 mov cx, 1920 ;24*80 27 s1: 28 inc di 29 mov es:[di],bl 30 inc di 31 loop s1 32 ret 33 34 35 printNumber: 36 mov cx, len ;从符号stu_no开始的连续字节数据项个数 37 s2: 38 mov al, ds:[si] 39 mov es:[di], al 40 inc di 41 mov es:[di], bl 42 inc si 43 inc di 44 loop s2 45 ret 46 47 printLine: 48 mov cx, 34 49 s3: 50 mov word ptr es:[di], '-' 51 inc di 52 mov es:[di], bl 53 inc di 54 loop s3 55 ret 56 57 code ends 58 end main
结果截图: