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

实验任务1

源码

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 si, 2

add di, 2

可以替换,因为add后没有溢出,和inc两次是同样的效果。

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

 

程序执行之前:

x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h

y dw 3210h,5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h

 

程序执行之后:

4230H 7750 88f5 a181 5abb 62c8

 

 

实验任务2

源码

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

运行测试截图

 

 

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

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

将输入的字符串按顺序从al复制到ds:[si],偏移地址从0开始,且当遇到al遇到#是跳出循环

 

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

0AH是换行符的ASCII码,实现的功能是换行

 

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

实现的是将line11-18输入的字符串在屏幕上显示

 

实验任务3

源码

assume cs:code, ds:data

data segment

x dw 20,1,983,2900,65

len equ $- x

data ends

stack segment

    dw 32 dup(?)

stack ends

 

code segment

start: 

mov ax, data

mov ds, ax

 

mov ax, stack

mov ss, ax

mov sp, 64

mov si,offset x   

mov cx,len/2

 

s:  

mov ax, ds:[si]

inc si

inc si

push cx

    call  printNumber

    call  printSpace

pop cx

loop s

 

    mov ah, 4ch

    int 21h

 

printNumber:

mov bx,0   

putin: 

mov di,10

mov dx,0

div di

push dx

inc bx  

cmp ax,0

jne putin

 

mov cx,bx

putout:

pop dx

add dl,30h

mov ah,2

 int 21h

loop putout

 

ret

 

printSpace:

mov ah, 2

mov dl, ' '

int 21h

ret

 

code ends

end start

 

实验4

assume cs:code, ds:data

data segment

str db "assembly language, it's not difficult but tedious"

len equ $ - str

data ends

 

stack segment

    dw 8 dup(?)

stack ends

 

code segment

start: 

mov ax, data

mov ds, ax

 

mov si,0

mov cx,len

call strupr

call printall

 

mov ax,4c00h

int 21h

 

strupr:

push cx

push si

s1:

mov al,ds:[si]

cmp al,97

jl continue

cmp al,122

jg continue

and al,0dfh

mov ds:[si],al

 

continue:

inc si

loop s1

 

pop si

pop cx

ret

 

printall:

push cx

push si

 

printone:

mov ah,2

mov dl,ds:[si]

int 21h

inc si

loop printone

 

pop si

pop cx

ret

 

code ends

end start

 

实验五

源码

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时,右下角显示yes;当输入除7以为的字符时,右下角显示no

 

 

实验任务六

源码6-1

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

 源码6-2

assume cs:code

code segment
start:
    int 42

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

 

 

中断也是异常的一种,中断有硬中断(由硬件产生的中断)和软中断(软件产生的中断)之分。ARM有七种不同的中断源,在中断向量表中对应的地址范围是0X00 ~ 0X1C,本章只介绍软中断。软中断执行由SWI指令产生,用于用户模式下的程序调用特权操作指令。内中断程序可以使CPU在执行到特殊情况时调用,中断处理程序可以让CPU从错误中恢复,比如除法中除0的错误。中断向量表存储在0000:0000开始空间中,可以存一个字的中断程序地址。

 

posted @ 2021-12-13 23:32  linke123  阅读(90)  评论(2)    收藏  举报