实验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
    
  • 回答问题

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

    add si, 2
    add di, 2
    

    不能。因为inc换成add有可能引起进位,导致原本计算中的adc计算错误。

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

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

2.实验任务2

  • 程序task2.asm源码

    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
    
  • 运行测试截图

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

  • 回答问题

    运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结果。结合运行结果,理解代码并回答问题:
    ① 汇编指令代码line11-18,实现的功能是?

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

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

    换行。

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

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

3.实验任务3

  • task3.asm源码

    assume cs:code, ds:data
    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, 5
    	
    s:	mov ax, [si]
    	push cx
    	call printNumber
    	call printSpace
    	add si, 2
    	pop cx
    	loop s
    	
    	mov ah, 4ch
    	int 21h
    	
    printNumber:   
    	mov dx, 0
    	mov cx, 0
    s1:	mov bx, 10
    	div bx
    	push dx
    	mov dx, 0
    	inc cx
    	add ax, 0
    	jnz s1
    	
    s2:	pop dx
    	mov ah, 2
    	add dl, '0'
    	int 21h
    	loop s2
    	ret
    	
    printSpace:
    	mov ah, 2
    	mov dl, ' '
    	int 21h
    	ret
    
    code ends
    end start
    
  • 运行测试截图

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

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调用之前,数据段的值,以及,调用之后,数据段的值)

    调用之前:

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

    调用之后:

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

5.实验任务5

  • task5.asm源码

    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,以及输入其他字符,运行结果截图)

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

  • 程序的功能是?

    从键盘输入一个字符,判断是否为7,若为7在屏幕的第24行第70列显示yes,否则在屏幕的第24行第70列显示no。

6.实验任务6

  • 通过此项实现任务,对中断、软中断实现机制的理解

    中断:CPU在接收到外部发送的或内部产生的一种特殊信息时,会立即处理特殊信息。

    软中断:CPU内部产生特殊信息(如除法错误、单步执行、执行into指令和执行int指令)时,立即处理该情况。

  • 选一个未被使用的中断码,实现一个中断例程,并调用测试。给出源码和运行测试截图。(选做 *)

五、实验总结(选)

上一篇:【luogu1005】【noip2007】 矩阵取数游戏 [区间dp]


下一篇:gitbook build/serve 失败,Error: ENOENT: no such file or directory, stat ...