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

实验一

原程序运行结果如下:

 

运行结束后x,y标号处数据结果如下:

 

 发现x处16字节数据变成了原来的x+y

将inc改为add运行结果如下:

 

 

 

 

 发现在此处2者对程序运行没有影响。

但查阅资料可知:inc对zf造成影响,而add对zf和cf造成影响,也就是add的进位信息会被保留,但inc不会。

 

实验任务2

运行结果如下:

 

 (1)11~18行功能:

将一个字符输入al,并且保存到ds:[si],即data段里,并且比较al和‘#’,如果相等跳转至next标号执行,不相等则继续输入下一个字符并保存到

data段。

(2)20~22行功能:

查阅资料知,换行ascii码为10,16进制即为000ah,所以功能为输出换行符。

(3)

将ds处,即data段的si个字符输出。

 

实验任务3

代码如下:

assume cs:code, ds:data
data segment 
     x dw 91, 792, 8536, 65521, 2021 
     len equ $ - x 
data ends
stack segment
      db 16 dup(0)
stack ends
code segment
start:
     mov ax,data
     mov ds,ax
     mov si, offset x
     mov cx,5
s:   mov ax,ds:[si]
      call PrintNumber
      call PrintSpace
      inc si
      inc si
      loop s

       mov ah,4ch
       int 21h

PrintNumber:
      mov bx,0Ah ;除数10
      mov dx,0  ;AX存储除法操作的商,DX存储除法操作的余数, 被除数为32位,被  除数则在(DX和AX)中存放,DX存放高16位,AX存放低16位。
       mov di,0 ;di记录位数
       push cx  ;当前cx进栈
s1:
     div bx;
     push dx;
     inc di
     mov dx,0
     cmp ax,0
    je  next
    jmp s1
next:
    mov cx, di
     mov ah,2  ;打印相应中断
s2:
     pop dx
     or dl,30h
      int 21h
     loop s2s
     pop cx
    ret

PrintSpace:
    mov ah,2d
    mov dl, ' '
   int 21h
    ret
code ends
end start

 

运行结果如下:

 

实验任务4

查阅资料,大小写转换方法如下;

 
or al,00100000B ;将字符的第五位转换成1,转换成小写字母;
and al,11011111B ;将字符的第五位转换成0,转换成大写字母
代码如下:
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,offset str
f:
    call strupr
    loop f
    mov ah,4ch
    int 21h
strupr:

    mov al,ds:[si]
     cmp al,'a'
     jb print ;小于
     cmp al,'z'
     ja print  ;大于
     mov ah,2
     and al,11011111B
    mov dl,al
    int 21h
    inc si
    ret
print:
    mov ah,2
    mov dl,al
    int 21h
   inc si
   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

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-11 16:45  玉骢  阅读(51)  评论(2编辑  收藏  举报