实验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

 

 

posted @ 2021-11-29 17:48  山林路  阅读(41)  评论(2)    收藏  举报