实验4 8086标志寄存器及中断

实验任务1

答案

  1. 可以替换:

    • 运行源程序:
      image-20211207162237391

      可见成功地获得了存储在x段的结果。

    • 运行修改过的程序:

      image-20211207162441419

      获得了同样的结果

    • 功能性上获得相同数据,可见可以替换

  2. 经过调试,发现数据段中x段随着程序的运行,其中数据依次变为原数据与y段相应数据之和,最后获得题目要求效果。

实验任务2

答案

  • 可以看到,程序复制输出了输入的字符串(除#以外)

    image-20211207163359078

  1. line 11-18 实现的功能是:

    • 不断接受键盘上输入的字符,并且将这些字符存储到预先定义好的数据段中
    • 判断输入的字符是否为 “#” ,如果为 “#” 则调用 next 函数为输出数据做准备
  2. line 20-22 实现的功能是:

    • 首先向屏幕输出一个换行符
    • 将目前的 si 转移到 cx 作为输出字符个数
    • 初始化 si 使其指向数据段首部
  3. line 24-30 实现的功能是

    • 循环输出数据段中的字符
    • 输出完以后程序调用返回dos的中断以结束程序

实验任务3

代码

assume cs:code,ds:data

data segment
    x dw 91,792,8536,65521,2001
    len equ $-x
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov si,offset x
    mov cx,len/2
s:  
    mov ax,ds:[si]
    call printNumber
    call printSpace
    add si,2
    loop s 

    mov ah,4ch
    int 21h

printNumber: 
    push cx
    mov bx,10
    mov di,0
    ;进行循环将数字一遍遍除以10,直到最终被除数为0
p:  mov dx,0
    div bx
    push dx;dx存放余数(当前最低位)
    inc di
    cmp ax,0;判断当前待除区还有没有数
    jne p;循环将大数字拆成多为零散数字并压入栈
    
    mov cx,di
    
    mov ah,2
m:  pop dx
    or dl,30h;ascii转换
    int 21h
    loop m

    pop cx
    ret


printSpace:
    mov ah,2
    mov dl,20h;空格键的ASCII
    int 21h
    ret

code ends
end start 

运行结果

image-20211208191551823

可见成功运行。

实验4

代码

assume cs:code,ds:data

data segment
	str db "assembly language, it's not difficult but tedious"
	len equ $ - str
data ends

code segment
start:
	mov ax,data
	mov ds,ax
	mov si,offset str
	mov cx,len
s:	call strupr
	inc si
	loop s
	
	mov ah,4ch
	int 21h
	
strupr:
	mov bl,[si]
	cmp bl,61h;将字母跟小写a比较
	jb exit;小于小写a的ascii即退出
	cmp bl,7ah;将字母与z比较debug
	ja exit;大于z即退出
	sub bl, 32
	mov [si],bl
exit:	
	mov ah,2
	mov dl,bl
	int 21h
	ret
code ends
end start

运行结果

  • 为了方便观察,为程序添加了回显功能

image-20211208201149070

可见符合要求

实验5

运行结果

根据观察:

  • 当向屏幕输入 7 时,屏幕将于24行70列显示yes

    image-20211208201711986

  • 输入非 7 时,屏幕将于相同位置显示no

分析

  1. 当代码运行至je s1时,若 al 等于 7 时,将跳转到段 s1 ,s1 调用了int 21h的九号子功能,显示了str 2处的以“$”为结尾的字符串yes。
  2. 显示no同理。

实验6

实验与代码

  1. 对两个程序进行编译运行,成功在屏幕上获得回显。

    image-20211209083659287

  2. 编写程序以完成以下内容:

    • 自定义114号中断,实现在屏幕上打印闪烁的字符串
assume cs:code

code segment
start:

    mov ax, cs
    mov ds, ax
    mov si, offset int114 

    mov ax, 0
    mov es, ax
    mov di, 200h        
    mov cx, offset int114_end - offset int114
    cld
    rep movsb

    ; set IVT(Interrupt Vector Table)
    mov ax, 0
    mov es, ax
    mov word ptr es:[114*4], 200h
    mov word ptr es:[114*4+2], 0

    int 114
    mov ah, 4ch
    int 21h

int114: 
    jmp short int114_start
    str db "root@Lihewin:/home# apt-get moo"
    len equ $ - str
    str1 db "...Have you mooed today?..."
    len1 equ $ - str1

    
int114_start:
    mov ax, cs
    mov ds, ax
    mov si, 202h

    mov ax, 0b800h
    mov es, ax
    mov di, 0e60h
    mov cx, len
s:  mov al, [si]
    mov es:[di], al
    mov byte ptr es:[di+1], 7
    inc si
    add di, 2
    loop s
    
    mov di,0e9eh
    mov al,5fh
    mov es:[di], al
    mov al,8ch
    mov es:[di+1], al
    
    mov di, 0f00h
    mov cx, len1
s1: mov al, [si]
    mov es:[di], al
    mov byte ptr es:[di+1], 2
    inc si
    add di, 2
    loop s1

    iret
int114_end:
   nop
code ends
end start

运行截图

image-20211209092408424

成功运行。

总结

本章实验主要涉及了条件跳转与中断的定义与调用的知识点。

posted @ 2021-12-09 09:37  Lihewin  阅读(37)  评论(1)    收藏  举报