实验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

答:不能。原因:因为如果使用add会导致进位寄存器CF的值发生变化。如果本来应当是有进位的,CF的值为CY(1),但是做了add操作后CF会变成NC(0),会对后面的位数加法产生影响。所以不能使用add

 

实验任务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,实现的功能是?

      答:从键盘上读取输入的字符,并保存到ds:[si],每读入一个就判断是否为#,如果是则不保存,转跳至标号next处执行;如果不是则si + 1并继续读入下一个字符。

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

      答:打印一个回车(换行符)。

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

      答:打印字符串,并且不会把#打出来。

实验任务3

assume cs:code, ds:data
data segment
    ;x db  99,72,85,63,89,97,55
    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

        do:
            mov ax,[si]

            add si,2
            push ax ;保存寄存器状态
            push bx ;保存寄存器状态
            push cx ;保存寄存器状态
            push dx ;保存寄存器状态

            mov bx,10
            mov cx,0

            yazhan:
                mov dx,0
                div bx

                push dx
                inc cx

                cmp ax,0
                jz chuzhan

                jmp yazhan

            chuzhan:
                pop dx
                printNumber:
                    add dl,30h
                    mov ah,2
                    int 21h

            loop chuzhan

                pop dx
                pop cx
                pop bx
                pop ax

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

        loop do


        mov ah, 4ch
        int 21h
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
   
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

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;如果不是则输出no。

实验任务6

task6-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

task6-2

assume cs:code
code segment
start:
int 42 ; 
mov ah, 4ch
int 21h
code ends
end start

 

 

posted @ 2021-12-13 17:39  Panzerkampfwagen  阅读(47)  评论(3)    收藏  举报