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

实验一

① 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)没有影响。

 

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

 

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

答:不可以,因为add有可能会改变进位标志位,在执行adc指令的时候结果就会出错。

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

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

 

 

 【实验后截图】

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

 

 

 实验二

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

【实验截图】

对源程序task2.asm进行汇编、链接,得到可执行文件task2.exe。 运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结果。 实验4 8086标志寄存器及中断 ① 汇编指令代码line11-18,实现的功能是?     使用int 21h中断的1号子功能,实现从键盘输入一个字符,存放在data段;若字符不为#,循环输入;否则跳转到标号为next的程序段。 ② 汇编指令代码line20-22,实现的功能是?     使用int 21h的2号子功能,输出ASCII码值为0ah的字符,即换行符。 ③ 汇编指令代码line24-30,实现的功能是?     使用int 21h的2号子功能,实现循环输出data段中存放的字符。

实验三

【实验代码】

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 bx,0
    mov cx,5

s:    mov ax,[bx]
    push cx
    push bx
    call printNumber
    pop bx
    pop cx
    add bx,2
    loop s

    mov ax, 4c00h
    int 21h

printNumber:
    mov si,0
    mov bx,10
s1:    mov dx,0
    div bx
     push dx
    inc si
    cmp ax,0
    jne s1

    mov cx,si
s2:    pop ax
    mov ah,2
    add al,48
    mov dl,al
    int 21h
    loop s2
    
    call printSpace
    ret

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

code ends
end start

【实验截图】

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

 

 

 实验四

【实验代码】

assume ds:data,cs:code

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,0
    mov cx,len

    call strupr

    mov ax, 4c00h
    int 21h

strupr:
s:    mov al,[si]
    cmp al,'a'
    jge great;大于a跳转到great
    jmp print

next:    inc si
    loop s
    ret
    
great:    cmp al,'z'
    jle change;小于z跳转到change
    jmp print

change:    and al, 0dfh;小写转大写
    mov [si],al
    jmp print

print:    mov ah,2
    mov dl,al
    int 21h;输出字符
    jmp next
    
code ends
end start

【实验截图】

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

 

 

 实验五

【实验代码】

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    ;设置光标位置在第24行
    mov dl, 70    ;设置光标位置在第70列
    int 10h        ;设置光标位置

    cmp al, '7'
    je s1
    mov ah, 9
    mov dx, offset str2
    int 21h        ;显示标号str2处的字符串

    jmp over

s1: mov ah, 9
    mov dx, offset str1
    int 21h        ;显示标号str1处的字符串
over:  
    mov ah, 4ch
    int 21h
code ends
end start

 

【实验截图】

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

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

程序的功能是?

答:功能是当输入7时,在第24行第70列输出yes,当输入不为7时,在第24行第70列输出no。

实验六

对中断,软中断实现机制的理解:

(1)中断:当中断源发出中断信号时,CPU暂定当前的程序,转而去执行其它的程序,这个流程称为中断。中断可以通过改变CS:IP来实现。

(2)软中断:软中断是CPU内部产生的中断信号,比如除法溢出,或者调用中断例程,其实现方式和call类似

 
上一篇:CPU如何与外围设备交互(8086)


下一篇:实验4 8086标志寄存器及中断