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

实验3

1. 实验任务1

使用任何一款文本编辑器,录入8086汇编程序源码task1.asm

assume cs:code, ds:data

data segment
    x db 1, 9, 3
    len1 equ $ - x

    y dw 1, 9, 3
    len2 equ $ - y
data ends

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

    mov si, offset x
    mov cx, len1
    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
    mov cx, len2/2
    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

对源程序进行汇编、链接,得到可执行程序task1.exe,运行后,结合运行结果和注释,及必要的debug

调试:

  1. 回答问题

① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,

分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得

到跳转后标号s1其后指令的偏移地址的。

用补码形式告诉偏移地址是

在转移指令E2 F2中,告诉CPU的转移位移

076B:001B与076B:000D相差十进制的14,

image-20211123162610832

② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,

分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得

到跳转后标号s2其后指令的偏移地址的。

image-20211123170105931

F0为补码表示的偏移地址,偏移量为16

③ 附上上述分析时,在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
ax = s1 处的 IP
bx = s2 的 IP
cx = s2 的 CS

① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,

寄存器(ax) = 0021

寄存器(bx) = 0026

寄存器(cx) = 076C

image-20211128172559184

② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论

分析结果是否一致。

3.实验任务3

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

编写8086汇编源程序task3.asm,在屏幕上以十进制形式输出data段中这一组连续的数据,数据和数据

之间以空格间隔。

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

要求:

编写子程序 printNumber

功能:以十进制形式输出一个两位数

入口参数:寄存器ax(待输出的数据 --> ax)

出口参数:无

编写子程序 printSpace

功能:打印一个空格

入口参数:无

出口参数:无

在主体代码中,综合应用寻址方式和循环,调用printNumber和printSpace, 实现题目要求。

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,0

 s:   mov al,[si]
       mov ah,0
       call printNumber
       call printSpace
       inc si
       loop s

       mov ah, 4ch
       int 21h
 printNumber: 
 		mov bl,10
        div bl
        mov bh,ah
        mov ah,2h
        add al,48
        mov dl,al
        int 21h
        mov ah,2h
        add bh,48
        mov dl,bh                        
        int 21h
        ret

   printSpace:    
   		mov ah,2h 
        mov dl,' '                       
        int 21h             
        ret

       
code ends
end start
image-20211127152423303

附*:int 21h中的2号子功能说明如下:

; 功能:输出单个字符 
mov ah, 2 mov dl, ×× ; ××是待输出的字符,或其ASCⅡ码值 
int 21h

4. 实验任务4

本题参考博客

汇编语言指令

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

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

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

要求:

编写子程序printStr

功能:在指定行、以指定颜色,在屏幕上显示字符串

入口参数

​ 字符串首字符地址 --> ds:si(其中,字符串所在段的段地址—> ds, 字符串起始地址的偏

​ 移地址—> si)

​ 字符串长度 --> cx

​ 字符串颜色 --> bl

​ 指定行 --> bh (取值:0 ~24)

出口参数:无

在主体代码中,两次调用printStr,使得在屏幕最上方以黑底绿字显示字符串,在屏幕最下方以黑

底红色显示字符串

DATAS SEGMENT
    k db 'try'
    len equ $ - k
DATAS ENDS

STACKS SEGMENT
    db 16 dup(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    mov ax,DATAS
    mov ds,ax
    mov bl,2
    mov bh,0
    call p
    mov bl,4
    mov bh,240
    call p
    MOV AH,4CH
    INT 21H
  p:mov cx,len
  	mov si,0
  	mov ax,0B800H
  	add al,bh
  	mov es,ax
  	mov bp,0
  s:mov dl,ds:[bp]
    mov es:[si],dl
    mov es:[si+1],bl
    inc bp
    add si,2
    loop s
    ret
CODES ENDS
    END START

image-20211127154655602

5. 实验任务5

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

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

在80×25彩色字符模式下,在屏幕最后一行正中间显示学号。要求输出窗口蓝底,学号和两侧折线,以

白色前景色显示。

注:

  1. 80×25彩色字符模式显示缓冲区结构,参见教材「实验9 根据材料编程」里的说明。

  2. 编写程序实现时,将data段的学号换成自己的学号

DATAS SEGMENT
    stu_no db '201983290015'
    len = $ - stu_no
DATAS ENDS

STACKS SEGMENT
    db 16 dup(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    mov ax,DATAS
    mov ds,ax
    mov ax,0B800H
    mov es,ax
    mov cx,1920
    mov di,0
  s:call c1
    loop s
    mov cx,34
 s1:call c2
    loop s1
    mov si,0
    call m
    mov cx,34
 s2:call c2
    loop s2
    MOV AH,4CH
    INT 21H
 c1:mov byte ptr es:[di],32
 	mov byte ptr es:[di+1],16
 	add di,2
    ret
 c2:mov byte ptr es:[di],45
 	mov byte ptr es:[di+1],23
 	add di,2
 	ret
  m:mov cx,len
  p:mov dl,ds:[si]
    mov es:[di],dl
 	mov byte ptr es:[di+1],23
 	inc si
 	add di,2
 	loop p
 	ret
CODES ENDS
    END START

image-20211127155123694

posted @ 2021-11-28 19:00  当我傻  阅读(13)  评论(0编辑  收藏  举报