1.实验任务1
1 assume cs:code, ds:data 2 3 data segment 4 x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h 5 y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h 6 data ends 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov si, offset x 12 mov di, offset y 13 call add128 14 15 mov ah, 4ch 16 int 21h 17 18 add128: 19 push ax 20 push cx 21 push si 22 push di 23 24 sub ax, ax 25 26 mov cx, 8 27 s: mov ax, [si] 28 adc ax, [di] 29 mov [si], ax 30 31 inc si 32 inc si 33 inc di 34 inc di 35 loop s 36 37 pop di 38 pop si 39 pop cx 40 pop ax 41 ret 42 code ends 43 end start
答:line31~line34的4条inc指令不能替换为add,依据在于adc是带进位加法指令,而add会影响进位标志位,很可能使计算结果有误,inc指令则不会影响进位标志位。
做128位加之前:
做128位加之后:
2.实验任务2
1 assume cs:code, ds:data 2 data segment 3 str db 80 dup(?) 4 data ends 5 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov si, 0 11 s1: 12 mov ah, 1 13 int 21h 14 mov [si], al 15 cmp al, '#' 16 je next 17 inc si 18 jmp s1 19 next: 20 mov ah, 2 21 mov dl, 0ah 22 int 21h 23 24 mov cx, si 25 mov si, 0 26 s2: mov ah, 2 27 mov dl, [si] 28 int 21h 29 inc si 30 loop s2 31 32 mov ah, 4ch 33 int 21h 34 code ends 35 end start
运行测试:
(1)汇编指令代码line11-18,实现的功能是接收从键盘上输入的一串以“#”结尾的字符。
(2)汇编指令代码line20-22,实现的功能是输出换行符。
(3)汇编指令代码line24-30,实现的功能是输出此前接收的字符串且不输出结尾的“#”。
3.实验任务3
1 assume cs:code,ds:data 2 3 data segment 4 x dw 91, 792, 8536, 65521, 2021 5 len equ $ - x 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov si, offset x 13 14 mov cx, len/2 ;从x开始的连续字数据项个数 15 s:mov ax, [si] 16 call printNumber 17 call printSpace 18 add si, 2 19 loop s 20 mov ax, 4c00h 21 int 21h 22 23 printNumber: 24 push cx 25 mov cx, 0 26 27 s1:mov dx, 0 28 mov bx, 10 29 div bx 30 push dx 31 inc cx 32 cmp ax, 0 33 jne s1 ;商不等于0则继续除 34 35 mov ah, 2 36 s2:pop dx 37 or dx, 30h 38 int 21h 39 loop s2 40 41 pop cx 42 ret 43 44 printSpace: 45 mov ah, 2 46 mov dl, ' ' 47 int 21h 48 ret 49 code ends 50 end start
运行测试:
4.实验任务4
1 assume cs:code,ds:data 2 3 data segment 4 str db "assembly language, it's not difficult but tedious" 5 len equ $ - str 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov si, offset str 13 mov cx, len 14 call strupr; 15 mov ax, 4c00h 16 int 21h 17 18 strupr: 19 mov al, [si] 20 cmp al, 97 21 jb s 22 cmp al, 122 23 ja s 24 and al, 0dfh 25 mov [si], al 26 s:inc si 27 loop strupr 28 ret 29 code ends 30 end start
调试截图:
5.实验任务5
程序的功能是判断从键盘输入的字符是否为7,并且将判断结果自第24行第70列开始输出。
6.实验任务6
Ⅰ、中断可分为内中断(软中断)与外中断(硬中断),当CPU检测到中断信息,它将在不再接着刚执行完的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。
Ⅱ、CPU内部产生中断信息的可能情况有四种:(1)除法错误;(2)单步执行;(3)执行into指令;(4)执行int指令。
Ⅲ、中断信息中包含有标识中断源的类型码,用于从中断向量表中查找到中断处理程序的入口地址。
Ⅳ、对于8086PC机,中断向量表指定放在内存地址0处,其中一个表项占两个字,高地址字存放中断处理程序的段地址,低地址字存放偏移地址。存储N号中断源对于的中断处理程序入口的段地址的内存单元的地址为:4N+2,偏移地址的内存单元的地址为4N。
Ⅴ、中断过程可表示为:
(1)取得中断类型码N;
(2)pushf
(3)TF=0,IF=0 (防止陷入一直处理单步中断处理程序的第一条指令的死循环)
(4)push CS
(5)push IP
(6)(IP)=(N*4),(CS)=(N*4+2)
之后CPU开始执行中断处理程序,中断处理程序的执行过程可表示为:
(1)保存用到的寄存器;
(2)处理中断;
(3)恢复用到的寄存器;
(4)用iret指令返回。
Ⅵ、在有些情况下,CPU不会响应中断,如设置栈顶指针ss:sp时。