实验3 转移指令跳转原理及其简单应用编程
一、实验目的
1. 理解和掌握转移指令的跳转原理
2. 掌握使用call和ret指令实现子程序的方法,理解和掌握其参数传递方式
3. 理解和掌握80×25彩色字符模式显示原理
4. 综合应用寻址方式和汇编指令完成简单应用编程
二、实验内容
1. 实验任务1
使用任何一款文本编辑器,录入8086汇编程序源码task1.asm。
task1.asm
assume cs:code, ds:data data segment x db 1, 9, 3 len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3 y dw 1, 9, 3 len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9 data ends code segment start: mov ax, data mov ds, ax mov si, offset x ; 取符号x对应的偏移地址0 -> si mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx 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 ; 取符号y对应的偏移地址3 -> si mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx 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
运行截图:

① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码, 分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得 到跳转后标号s1其后指令的偏移地址的。

loop s1跳转时,从001B跳转到了000D,跳转位移量=000D-001B=-14.
loop 000D的机器码为E2F2,F2是-14的补码。
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码, 分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得 到跳转后标号s2其后指令的偏移地址的。

loop s2跳转时,从0039跳转到0029,跳转位移量=0029-0039=-16.
loop 0029的机器码为E2F0,F0是-16的补码。
2. 实验任务2
使用任何一款文本编辑器,录入8086汇编程序源码task2.asm。
task2.asm
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
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器 (bx) = ? 寄存器(cx) = ?

ax=0021h,bx=0026h,cx=076ch。
call word ptr ds:[0] 短转移, 将下一条指令偏移地址(ip)压入栈, 并转移至 ds:[0]地址即 s1 处, 此后的 pop ax 将该内容出栈给ax;而call dword ptr ds:[2]为段间转移, 将下一条指令基址和偏移地址(cs 和 ip)压入栈, 并转移至 ds:[2] 地址即 s2 处, 此后的 pop bx 将ip出栈给bx, pop cx 将 cs 出栈给 cx.
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论 分析结果是否一致。

3. 实验任务3
task3.asm
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 cx,len mov si,offset x s: mov ah,0 mov al,ds:[si] call printNumber call printSpace inc si loop s mov ah,4ch int 21h printNumber: mov bl,10 div bl mov bh,ah mov dl,al or dl,30h mov ah,2 int 21h mov dl,bh or dl,30h int 21h ret printSpace: mov ah,2 mov dl,' ' int 21h ret code ends end start

4. 实验任务4
task4
assume cs:code, ds:data data segment str db 'try', 0 len equ $ - str data ends code segment start: mov ax, data mov ds, ax mov ax,0b800h mov es,ax mov si,offset printStr mov ah, 2 ;绿 mov bx,0 ;在第一行打印 call si mov si,offset printStr mov ah,4 ;红 mov bx,0F00H ;一行80个字符160字节,最后为24行5 call si mov ah, 4ch int 21h printStr: mov cx,len;打印字符 mov si,0 s: mov al,[si] mov es:[bx+si],ax inc si add bx,1 loop s ret code ends end start

5. 实验任务5
task5.asm
assume cs:code, ds:data data segment stu_no db '201983290388' len = $ - stu_no data ends code segment start: mov ax, data mov ds, ax mov ax,0b800H mov es,ax mov cx,0780H; mov ah,10H mov al,' ' mov bx,0 s: mov es:[bx],ax add bx,2 loop s mov cx,80 mov ah,17H mov al,'-' s1: mov es:[bx],ax add bx,2 loop s1 mov cx,len mov bx,0F44H mov si,0 s2: mov al,[si] mov es:[bx],ax inc si add bx,2 loop s2 mov ah, 4ch int 21h code ends end start

浙公网安备 33010602011771号