实验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
运行截图:
回答问题:
①line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s1其后指令的偏移地址的。
答:跳转的位移量为 -14。CPU先将ip值加上该指令的大小,即ip指向下一条指令,然后按照位移量来计算出跳转到的地址。
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s2其后指令的偏移地址的。
答:跳转位移量为 -16。CPU先将ip值加上该指令的大小,即ip指向下一条指令,然后按照位移量来计算出跳转到的地址。
③ 附上上述分析时,在debug中进行调试观察的反汇编截图
2.实验任务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
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ds:[0] 寄存器(bx) = ds:[2] 寄存器(cx) = ds:[4]
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试 结果与理论分析结果是否一致
调试结果界面截图:
ds:[0]=0021,ds[2]=0026, ds[4]=076C
结果一致。
3.实验任务3
程序源码task3_3.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 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 mov cx,len 13 mov si,offset x 14 s: mov al,[si] 15 mov ah,0 16 call pn 17 call ps 18 inc si 19 loop s 20 21 mov ax,4c00h 22 int 21h 23 24 pn: mov bl,0ah 25 div bl 26 27 mov bh,ah 28 mov dl,al 29 or dl, 30h 30 mov ah,2 31 int 21h 32 33 mov ah,bh 34 mov dl,ah 35 or dl, 30h 36 mov ah,2 37 int 21h 38 ret 39 40 ps: mov dl,' ' 41 mov ah,2 42 int 21h 43 ret 44 45 code ends 46 end start
运行测试截图:
4.实验任务4
程序源码task3_4.asm:
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 start: 10 mov ax,data 11 mov ds,ax 12 mov si,offset str 13 mov cx,len 14 mov bl,00000010B 15 mov bh,0 16 17 call printStr 18 19 mov ax,data 20 mov ds,ax 21 mov si,offset str 22 mov cx,len 23 mov bl,00000100B 24 mov bh,24 25 call printStr 26 27 mov ax,4c00h 28 int 21h 29 30 printStr: 31 32 mov ax,0b800h 33 mov es,ax 34 mov al,160 35 mul bh 36 mov di,ax 37 s: mov al,ds:[si] 38 mov es:[di],al 39 mov es:[di+1],bl 40 add di,2 41 inc si 42 loop s 43 ret 44 45 code ends 46 end start
运行测试截图:
5.实验任务5
程序源码task3_5.asm:
1 assume cs:code, ds:data 2 3 data segment 4 stu_no db '201983290110' 5 len equ $ - stu_no 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 mov ax,0b800h 13 mov es,ax 14 mov si,offset stu_no 15 mov bl,00010111B 16 mov di,0 17 mov cx,1920 18 s1: mov es:[di+1],bl 19 add di,2 20 loop s1 21 mov cx,40-len/2 22 s2: mov ax,'-' 23 mov es:[di],ax 24 mov es:[di+1],bl 25 add di,2 26 loop s2 27 mov cx,len 28 s3: mov ax,[si] 29 mov es:[di],ax 30 mov es:[di+1],bl 31 add di,2 32 inc si 33 loop s3 34 mov cx,40-len/2 35 s4: mov ax,'-' 36 mov es:[di],ax 37 mov es:[di+1],bl 38 add di,2 39 loop s4 40 code ends 41 end start
运行测试截图: