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

1. 实验任务1

task1.asm源码

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

 

 

 

对程序进行汇编、链接,得到可执行程序task1.exe。在debug中调试程序,并回答问题。

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

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

可以替换,si和di没有进位,这里对结果没有影响

 

 

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

使用任意文本编辑器,录入8086汇编源码task2.asm。

对源程序task2.asm进行汇编、链接,得到可执行文件task2.exe。

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

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

查看是否是#,是则进入next,否则继续输入

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

换行,设置循环次数

 

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

循环

 

3. 实验任务3

针对8086CPU,已知逻辑段定义如下:

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

要求:

编写子程序printNumber功能:

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

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

   出口参数:无

编写子程序printSpace

   功能:打印一个空格

   入口参数:无

   出口参数:无

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

正确编写后,预期测试结果如下:

 

 源码:

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 si, offset x
   mov cx, len/2    
   
r:mov bx, 0
   mov ax, ds:[si]
   call printNumber
   call printSpace
   inc si
   inc si
   loop r

   mov ah, 4ch
   int 21h

printNumber: push ax
   push bx
   push cx
   push dx
   push si

s: mov dx, 0   
   mov word ptr ds:[len], 10
   div word ptr ds:[len]
   add dx, 30h
   push dx
   inc bx
   cmp ax, 0
   je s1  
   jmp s

s1:mov cx, bx
x1:pop ax
    mov ah, 2
    mov dl, al
    int 21h
    loop x1
    
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret

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

code ends
end start

 

 

 

4. 实验任务4

task4.asm源码

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 si, offset str
    mov cx, len
    
s:    call strupr
    
    mov ah, 4ch
    int 21h
    
strupr:   
s1:    mov al, [si]
    cmp al, 'a'
    jb s2
    cmp al, 'z'
    ja s2
    sub byte ptr [si], 32
s2: inc si
    loop s1

code ends
end start

在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

 

5. 实验任务5

使用任意文本编辑器,录入8086汇编源码task5.asm。

对源程序task5.asm进行汇编、链接,得到可执行文件task5.exe。

运行程序,输入7,观察结果。输入其他字符,观察结果。结合运行结果和注释,理解代码实现的功能

 

 判断输入的字符是否为7,是则输出yes,不是则输出no

6. 实验任务6

实验任务1、2、3、5中使用了不少系统提供的中断例程。本实验任务中,要求自行实现一个42号软中断 例程,使得通过 int 42 或 int 2ah 软中断调用,实现在屏幕最下方中间以黑底绿字打印"welcome to 2049!"。

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

对汇编源程序task6_2.asm进行汇编、链接,得到可执行程序task6_2.exe。运行task6_2.exe。

两个程序正确编写、汇编、链接,运行后,预期结果如下:

 

posted @ 2021-12-13 21:58  Aost  阅读(51)  评论(0)    收藏  举报