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

在debug环境中,分别实践、观察: ① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?

都有影响

② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?

ZF有影响,CF无影响

 

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

 

不能。因为如果使用add会导致进位寄存器CF的值发生变化。

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

加之前:

 

 加之后:求和成功

 

 

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

实验结果:

 

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

从键盘上读取输入的字符一直到#停止,并保存到ds:[si];读到#后到next处执行

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

打印一个换行符

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

打印字符串,一直到#停止,#不打印

 

实验任务3

编写8086汇编源程序task3.asm,在屏幕上以十进制形式输出data段中这一组连续的数据,数据和数据 之间以空格间隔。

要求: 编写子程序printNumber 功能:

以十进制形式输出一个任意位数的整数(整数范围0 ~ 65535)

入口参数:寄存器ax(待输出的数据 --> ax)

出口参数:无

编写子程序printSpace 功能:

打印一个空格 入口参数:无

出口参数:无

在主体代码中,综合应用寻址方式和循环,调用printNumber和printSpace, 实现题目要求。

源码

assume ds:data, cs:code, ss:stack

data segment
    x dw 91, 792, 8536, 65535, 2021
    len equ $ - x
data ends

stack segment
    dw 8 dup(?)
stack ends

code segment
start:
    mov ax, data
    mov ds, ax

    mov ax, stack
    mov ss, ax
    mov sp, 16

    mov cx, len/2
    print:
        mov ax, word ptr ds:[di]
        add di, 2

        push cx
        call printNumber
        call printSpace

        pop cx
    loop print

    mov ah, 4ch
    int 21h

; 子程序: printNumber
; 功能: 打印数字

;       bx -> 存储数字字符个数
printNumber:
    mov bx, 0
    ; getEach循环: 获取每一位,然后压入栈中
    getEach:
        ; 除数放在16位寄存器bp中
        mov bp, 10
        mov dx, 0
        div bp

        push dx
        inc bx

        mov cx, ax
        inc cx

    loop getEach

    ; 打印数字
    mov cx, bx
    printEach:
        pop dx
        add dl, 30h
        mov ah, 2
        int 21h
    loop printEach

    ret

; 子程序: printSpace
; 功能: 打印空格
printSpace:
    mov ah, 2
    mov dl, 20h
    int 21h
    ret

code ends
end start

实验结果:

 

 

实验任务4

编写8086汇编源程序task4.asm,将data段中字符串里的小写字符转换成大写。

要求:编写子程序strupr

功能:将包含任意字符的字符串中的小写字母变成大写

入口参数(ds:si ) 字符串首地址的段地址和偏移地址分别送至ds和si

(cx) 字符串的长度

出口参数:无

在主体代码中,设置入口参数,调用strupr, 实现题目要求。

 

源码

assume cs:code,ds:data
data segment
    str db "assembly language, it's not difficult but tedious"
    len equ $ - str
data ends

stack segment
    db 8 dup(?)
stack ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov si, 0
    mov cx, len
    call strupr
    call printStr

    mov ax, 4c00h
    int 21h

; 子程序 strupr
;   功能: 将包含任意字符的字符串中的小写字母变成大写
;   入口参数
;       (ds:si) 字符串首地址的段地址和偏移地址分别送至ds和si
;       (cx) 字符串的长度
strupr:
    push cx
    push si
    transform:
        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 transform

    pop si
    pop cx
    ret

; 子程序 printStr
;   功能: 打印字符串
;   入口参数
;       (ds:si) 字符串首地址的段地址和偏移地址分别送至ds和si
;       (cx) 字符串的长度
printStr:
    push cx
    push si

    print:
        mov ah, 2
        mov dl, ds:[si]
        int 21h
        inc si
    loop print

    pop si
    pop cx
    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 ; 设置光标位置在第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 ; 显示标号str2处的字符串
over:
mov ah, 4ch
int 21h
code ends
end start

实验结果:

 

 

程序的功能是判断字符是否为7; 为7输出yes;不是7输出no;

 

 实验任务6

运行42号中断程序

对汇编源程序task6_1.asm进行汇编、链接,得到可执行程序task6_1.exe。运行task6_1.exe,实现将 42号中断处理程序安装到0:200开始的连续内存空间,并设置中断向量表,使得将来通过 int 42 ,系统 可以跳转到中断处理程序。 对汇编源程序task6_2.asm进行汇编、链接,得到可执行程序task6_2.exe。运行task6_2.exe。

通过编译连接运行task6_1.exetask6_2.exe后可以看到,屏幕底部出现了绿色的"welcome to 2049!",说明42号中断程序被成功调用。

 

posted @ 2021-12-12 17:40  一只大灰狼233  阅读(52)  评论(3编辑  收藏  举报