ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-17 01:02:16  阅读:154  来源: 互联网

标签:8086 code 中断 mov int si 寄存器 ax data


实验一

① 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位加之前,和,加之后,数据段的值的变化。
【实验前截图】

 

 

 【实验后截图】

 

 

 

 实验二

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#),观察结果。 ① 汇编指令代码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

【实验截图】

 

 

 实验四

【实验代码】

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

【实验截图】

 

 

 实验五

【实验代码】

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

 

【实验截图】

程序的功能是?

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

实验六

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

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

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

 

标签:8086,code,中断,mov,int,si,寄存器,ax,data
来源: https://www.cnblogs.com/blessings/p/15700577.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有