实验3 转移指令跳转原理及其简单应用编程

1. 实验任务1

使用任何一款文本编辑器,录入8086汇编程序源码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其后指令的偏移地址的。

12

 

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

 

14

③ 附上上述分析时,在debug中进行调试观察的反汇编截图

 

 2. 实验任务2

使用任何一款文本编辑器,录入8086汇编程序源码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) = 0021h 寄存器 (bx) = 0026h 寄存器(cx) = 076ch

3. 实验任务3

针对8086CPU,已知逻辑段定义如下:

data segment
x db 99, 72, 85, 63, 89, 97, 55
len equ $- x
data ends

实验源码:

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 si,offset x
    mov cx,len
    
  s:mov ah,0
    mov al,[si]
    mov bl,10
    div bl;用ax中的数字除以10,商在al中,余数在ah中mov dx,ax
             
    call printNumber
    call printSpace
    
    inc si
    loop s
    
    mov ah,4ch
    int 21h
    
printNumber: 
             mov dx,ax
             add dx,3030h;数字与字符串之间ascll码值的关系,将数字->字符
             mov ah,2;输出字符
             int 21h
             mov ah,2
             mov dl,dh
             int 21h
             ret
printSpace:  mov dl,' '
             int 21h
             ret
             
code ends
end start

 

 4. 实验任务4

给出程序源码task4.asm 

assume cs:code, ds:data

data segment 
    str db 'try',0
    len equ $ - str 
data ends

code segment
start: mov dh,1 ;设置行数
       mov dl,0 ;设置列数
       mov cl,2 ;设置颜色
       mov ax,data
       mov ds,ax
       mov si,0
       call show_str
       
       mov dh,25 ;重置行列数和颜色
       mov dl,0
       mov cl,4
       call show_str
       
       mov ax,4c00h
       int 21h
show_str:
       push cx
       push si
       mov ax,0b800h
       mov es,ax
       mov al,0a0h
       dec dh
       mul dh
       mov bx,ax
       mov al,2
       mul dl
       sub dl,2
       add bx,ax ;得到现实的偏移位置
       mov di,0
       mov ch,0
       mov al,cl
    s:
       mov cl,ds:[si]
       jcxz next :判断最后一个字符是否为零,如果是零则结束
       mov es:[bx+di],cl ;字符串放到前面
       mov es:[bx+di+1],al ;颜色放到后面
       add di,2
       inc si
       jmp s
    next:
       pop si
       pop cx
       ret
code ends
end start

 

 5. 实验任务5

给出程序源码task5.asm 

assume cs:code ds:data

data segment
stu_no db '201983290119' 
len = $ - stu_no 
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov bx,0

    mov ax,0b800h
    mov es,ax
    mov cx,80
    mov si,0f00h
    mov dl,'-'
s1: mov es:[si],dl;将最后一行全部填充-
    add si,2
    loop s1

    mov cx,len
    mov si,0f44h
s2: mov dl,ds:[bx];从最后一行68字节开始填充学号
    mov es:[si],dl
    add si,2
    inc bx
    loop s2

    mov cx,2000
    mov si,1
    mov dl,17h
s3: mov es:[si],dl;全部填充蓝色
    add si,2
    loop s3

    mov ax,4c00h
    int 21h

code ends
end start

 

posted @ 2021-11-29 18:40  醴泉  阅读(41)  评论(2)    收藏  举报