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

实验任务1

验证性实验:有些汇编指令会影响到标志寄存器中的一个或多个状态标志位。

在debug环境中,分别实践、观察:

① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?

add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)均有影响。

② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?

inc指令对标志寄存器中的零标志位ZF(Zero Flag)有影响,对进位标志位CF(Carry Flag)无影响。

使用任意文本编辑器,录入8086汇编源码task1.asm。

assume cs:code, ds:data

data segment
   x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
   y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
data ends
code segment 
start:
    mov ax, data
    mov ds, ax
    mov si, offset x
    mov di, offset y
    call add128

    mov ah, 4ch
    int 21h

add128:
    push ax
    push cx
    push si
    push di

    sub ax, ax

    mov cx, 8
s:  mov ax, [si]
    adc ax, [di]
    mov [si], ax

    inc si
    inc si
    inc di
    inc di
    loop s

    pop di
    pop si
    pop cx
    pop ax
    ret
code ends
end start

在代码段种,调用add128实现对标号x和y处存储的两个128位数据相加,结果保存在x处的连续128个字节中。

对程序进行汇编、链接,得到可执行程序task1.exe。在debug中调试程序,并回答问题。

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

add si, 2 
add di, 2

答;不能被替换,inc指令对进位标志位无影响,而add指令对进位标志位有影响。

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

 相加前

 

 

相加后

 

实验任务2

使用任意文本编辑器,录入8086汇编源码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

对源程序task2.asm进行汇编、链接,得到可执行文件task2.exe。

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

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

判断输入的字符是否为“#”,若为“#”则跳转到next处执行,若不是,则si+1

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

输出一个回车符,也就是换行

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

 输出字符串,但不包括“#”

 

实验任务3

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

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

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

要求:

编写子程序printNumber

功能:以十进制形式输出一个任意位数的整数(整数范围0 ~ 65535)

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

出口参数:无

编写子程序printSpace

功能:打印一个空格

入口参数:无

出口参数:无

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

assume ds:data, cs:code, ss:stack
 
data segment
    x dw 91, 792, 8536, 65535, 2021
    len equ $ - x
data ends
 
stack segment
    dw 8 dup(0)
stack ends
 
code segment
start:
    mov ax, data
    mov ds, ax
 
    mov ax, stack
    mov ss, ax
    mov sp, 16
 
    mov cx, len/2 ;
    print:
        mov ax, word ptr ds:[di]   
        add di, 2                   
        push cx 
        call printNum    ; 打印数字
        call printSpace     ; 打印空格
        pop cx             
        loop print
     
        mov ah, 4ch
        int 21h
 
printNum:
    mov bx, 0       ; 获取位数
count:
        mov bp, 10      
        mov dx, 0           
        div bp         
        push dx        
        inc bx          
        mov cx, ax     
        inc cx         
        loop count
        mov cx, bx          ; 将位数赋值,用于循环
printcount:
        pop dx          
        add dl, 30h       ;数字转为字符串
        mov ah, 2 
        int 21h
        loop printcount
        ret
 
printSpace:
    mov ah, 2
    mov dl, 20h
    int 21h
    ret
 
code ends
end start

实验结果

 

实验任务4

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

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

编写8086汇编源程序task4.asm,将data段中字符串里的小写字符转换成大写。

要求:

编写子程序strupr

功能:将包含任意字符的字符串中的小写字母变成大写

入口参数

(ds:si ) 字符串首地址的段地址和偏移地址分别送至ds和si

(cx) 字符串的长度

出口参数:无

在主体代码中,设置入口参数,调用strupr, 实现题目要求。

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 cx, len
    mov si, 0
  
s:
    call strupr
  
    mov cx, len
    mov si, 0
    mov ah, 2

printStr:
    mov dl, ds:[si]
    int 21h
    inc si
    loop printStr
  
    mov ah, 4ch
    int 21h

strupr:
    mov al, byte ptr ds:[si]
    cmp al, 'a'
    jb s0
    cmp al, 'z'
    ja s0
    sub al, 20h
    mov ds:[si], al
      
s0:
    inc si
    loop strupr
    ret

code ends
end start

实验结果

 

 

 

调用前

 

 

调用后

 

 

 

实验任务5

使用任意文本编辑器,录入8086汇编源码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

对源程序task5.asm进行汇编、链接,得到可执行文件task5.exe。

运行程序,输入7,观察结果。输入其他字符,观察结果。结合运行结果和注释,理解代码实现的功能

 

 

程序功能

判断从键盘上输入的字符是否为7,若输入字符为7,则在屏幕的第24行第70列显示yes,否则在屏幕的第24行第70列显示no。

 

实验任务6

实验任务1、2、3、5中使用了不少系统提供的中断例程。本实验任务中,要求自行实现一个42号软中断例程,

使得通过 int 42 或 int 2ah 软中断调用,实现在屏幕最下方中间以黑底绿字打印"welcome to2049!"。

建议配合教材第12章学习理解并实践。

assume cs:code

code segment
start:
    ; 42 interrupt routine install code
    mov ax, cs
    mov ds, ax
    mov si, offset int42  ; set ds:si

    mov ax, 0
    mov es, ax
    mov di, 200h        ; set es:di

    mov cx, offset int42_end - offset int42
    cld
    rep movsb

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

    mov ah, 4ch
    int 21h

int42: 
    jmp short int42_start
    str db "welcome to 2049!"
    len equ $ - str

    ; display string "welcome to 2049!"
int42_start:
    mov ax, cs
    mov ds, ax
    mov si, 202h

    mov ax, 0b800h
    mov es, ax
    mov di, 24*160 + 32*2

    mov cx, len
s:  mov al, [si]
    mov es:[di], al
    mov byte ptr es:[di+1], 2
    inc si
    add di, 2
    loop s

    iret
int42_end:
   nop
code ends
end start
assume cs:code

code segment
start:
    int 42

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

实验结果

 

posted @ 2021-12-12 19:03  那年夏天那抹蓝  阅读(64)  评论(3)    收藏  举报