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

1. 实验任务1

  • line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?

          不可以。因为inc指令不会影响CF位,而使用add指令后CF不会产生进位,CF为0,会影响下一次adc运算时CF的值。

  • 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。

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

          可以得出,完成了加法并 保存在ds:si开始的字节。

2. 实验任务2

程序task2.asm源码

assume cs:code, ds:data
data segment
        str db 80 dup(?)
data ends

code segment
start:  
        mov ax, data
        mov ds, ax
        mov si, 0
s1:        
        mov ah, 1
        int 21h
        mov [si], al
        cmp al, '#'
        je next
        inc si
        jmp s1
next:
        mov ah, 2
        mov dl, 0ah
        int 21h
        
        mov cx, si
        mov si, 0
s2:     mov ah, 2
        mov dl, [si]
        int 21h
        inc si
        loop s2

        mov ah, 4ch
        int 21h
code ends
end start

运行测试截图

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

回答问题

运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结 果。结合运行结果,理解代码并回答问题:

①      汇编指令代码line11-18,实现的功能是?

cmp比较是否与‘#’相等,据ZF跳转,若相等执行next程序段。

②      汇编指令代码line20-22,实现的功能是?

Next程序段用来输出换行符。

③      汇编指令代码line24-30,实现的功能是?

若不等于#则按顺序输出输入的内容。

 

3. 实验任务3

task3.asm源码

 

assume ds:data, cs:code

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

code segment
start:
    mov ax, data
    mov ds, ax
    mov si, offset x
    mov cx, len/2 

    s1:
      mov ax, word ptr ds:[si]    
      add si, 2                   
       push cx             
      call printNumber    
      call printSpace     
      pop cx              
    loop s1
    
    mov ah, 4ch
    int 21h

printNumber:
    mov bx, 0        
    s2:
        mov bp, 10      
        mov dx, 0           
        div bp          

        push dx         
        inc bx          
        
        mov cx, ax      
        inc cx          

    loop s2

   
    mov cx, bx          
    s3:
        pop dx         
        or dl, 30h     
        mov ah, 2      
        int 21h
    loop s3
    ret


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

code ends
end start

运行测试截图

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

4. 实验任务4

此部分书写内容:

task4.asm源码

 

assume cs:code, ds:data, ss:stack
data segment
str db "assembly language, it's not difficult but tedious"
len equ $ - str
data ends
stack segment
db len dup(' ')
code segment
start:
mov ax, data
mov ds, ax
mov si, 0
mov cx, len
call s1

mov ah, 4ch
int 21h


s1:
s0: mov dl, [si]
cmp dl, 'a'

jae s2 ;如果大于a的ASCII码跳转s2

s: mov ah, 2
int 21h

inc si
loop s0
ret

s2:
cmp dl,'z'
jbe s3  ;如果小于z的ASCII码跳转s3
s3:
and dl, 0dfh
mov [si],dl ;将转换后的大写字符存回原地址
jmp s       ;回到s打印字符

code ends
end start

在debug中调试截图( call strupr调用之前,数据段的值,以及,调用之后,数据段的值)

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

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

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

上图可用看出已将小写转换为大写并保存

5. 实验任务5

此部分书写内容:

task5.asm源码

assume cs:code, ds:data

data segment
    str1 db "yes", '$'
    str2 db "no", '$'
data ends

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

    mov ah, 1
    int 21h

    mov ah, 2
    mov bh, 0
    mov dh, 24
    mov dl, 70
    int 10h

    cmp al, '7'
    je s1
    mov ah, 9
    mov dx, offset str2
    int 21h

    jmp over

s1: mov ah, 9
    mov dx, offset str1
    int 21h
over:  
    mov ah, 4ch
    int 21h
code ends
end start

程序运行测试截图(输入7,以及输入其他字符,运行结果截图)

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

程序的功能是?

程序13-14行接收输入字符;

16-20行指定输出的位置,在24行第70列位置;

22行比较输入的字符与‘7’是否一致,如果一致跳转到s1输出str1字符串‘yes’,否则执行24-26行代码输出str2字符串’no‘。

 

6. 实验任务6

通过此项实现任务,你对中断、软中断实现机制的理解

自己选一个未被使用的中断码,实现一个中断例程,并调用测试。给出源码和运行测试截图。(选做 *)

如选做,请说明你使用的中断码,并描述你实现的这个中断例程的功能。

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

上一篇:Linux 信号编程


下一篇:寻址方式的综合应用(0803)