任务一

录入8086汇编程序源码task1.asm

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     x db 1, 9, 3
 5     len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3
 6     
 7     y dw 1, 9, 3
 8     len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9
 9 data ends
10 
11 code segment
12 start:
13     mov ax, data
14     mov ds, ax
15     
16     mov si, offset x ; 取符号x对应的偏移地址0 -> si
17     mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx
18     mov ah, 2
19 s1: mov dl, [si]
20     or dl, 30h
21     int 21h
22     
23     mov dl, ' '
24     int 21h ; 输出空格
25     
26     inc si
27     loop s1
28     
29     mov ah, 2
30     mov dl, 0ah
31     int 21h ; 换行
32     
33     mov si, offset y ; 取符号y对应的偏移地址3 -> si
34     mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx
35     mov ah, 2
36 s2: mov dx, [si]
37     or dl, 30h
38     int 21h
39     
40     mov dl, ' '
41     int 21h ; 输出空格
42     
43     add si, 2
44     loop s2
45     
46     mov ah, 4ch
47     int 21h
48 code ends
49 end start

① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码, 分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得 到跳转后标号s1其后指令的偏移地址的。

 

 cpu读取loop s1指令后,IP的值为 001Bh,需要跳转到地址为 000Dh,因此位移量为:目标地址-当前地址 = -14

 

② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码, 分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得 到跳转后标号s2其后指令的偏移地址的。

cpu读取loop s2指令后,IP的值为 0039h,需要跳转到地址 0029h,因此位移量为:-16

 

③ 附上上述分析时,在debug中进行调试观察的反汇编截图

如上所示

 

任务二

录入8086汇编程序源码task2.asm

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     dw 200h, 0h, 230h, 0h
 5 data ends
 6 
 7 stack segment
 8     db 16 dup(0)
 9 stack ends
10 
11 code segment
12 start:
13     mov ax, data
14     mov ds, ax
15     
16     mov word ptr ds:[0], offset s1  
17     mov word ptr ds:[2], offset s2
18     mov ds:[4], cs
19     
20     mov ax, stack
21     mov ss, ax
22     mov sp, 16
23     
24     call word ptr ds:[0]
25 s1: pop ax
26 
27     call dword ptr ds:[2]
28 s2: pop bx
29     pop cx
30     
31     mov ah, 4ch
32     int 21h
33 code ends
34 end start

① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器 (bx) = ? 寄存器(cx) = ?

ax = s1,bx = s2,cx = cs

② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论 分析结果是否一致。

 有上图可得,s1=0021h,s2=0026h,cs=0772h

 与理论分析结果一致

 

 

任务三

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

1 data segment
2     x db 99, 72, 85, 63, 89, 97, 55
3     len equ $- x
4 data ends

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

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3     x db 99, 72, 85, 63, 89, 97, 55
 4     len equ $- x
 5 data ends
 6 
 7 stack segment
 8     db 16 dup(0)
 9 stack ends
10 
11 code segment
12 start:
13     mov ax,data
14     mov ds,ax
15     mov ax,0b800h
16     mov es,ax
17     
18     
19     mov bx,0
20     mov si,0
21     
22     mov dx,offset printNumber
23     call dx        ;打印字符
24     mov bx,0
25     mov si,4
26     mov dx,offset printSpace
27     call dx        ;打印空格
28     
29     mov ah,4ch
30     int 21h
31     
32 printNumber:
33     mov cx,7h
34 s1: mov al,ds:[bx]
35     mov ah,0
36     mov dx,10    ;分离十位与个位
37     div dl
38     mov dl,10h
39     mov dh,ah
40     or al,30h
41     ;打印十位
42     mov ah,7
43     mov es:[si],ax
44     inc bx
45     add si,2
46     ;打印各位
47     mov al,dh
48     or al,30h
49     mov es:[si],ax
50     add si,4
51     
52     loop s1
53     ret
54 printSpace:
55     mov cx,7h
56 s2:    mov al,' '
57     mov ah,7
58     mov es:[si],ax
59     add si,6
60     loop s2
61     ret
62 code ends
63 end start

 

 

 

任务四

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

1 data segment
2     str db 'try'
3     len equ $ - str
4 data ends

编写8086汇编源程序task4.asm,在屏幕上以指定颜色、指定行,在屏幕上输出字符串:

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     s db 'try'
 5     len equ $ - s
 6 data ends
 7 
 8 code segment
 9 start:
10     mov ax,data
11     mov ds,ax
12     mov si,offset s
13     mov bp,0
14     mov bl,2
15     mov bh,0
16     
17     mov dx,printStr
18     call dx
19     mov si,offset s
20     mov bp,0
21     mov bl,4
22     mov bh,0f0h
23     mov dx,printStr
24     call dx
25     
26     mov ah,4c
27     int 21h
28 
29 
30 printStr:
31     mov ah,0b8h
32     mov al,bh
33     mov es,ax
34     mov cx,len
35 s1: mov dl,ds:[si]
36     mov es:[bp],dl
37     inc bp
38     mov es:[bp],bl
39     inc bp
40     inc si
41     loop s1
42     ret
43 
44 code ends
45 end start

 

 

任务五

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

1 data segment
2     stu_no db '201983290497'
3     len = $ - stu_no
4 data ends

在80×25彩色字符模式下,在屏幕最后一行正中间显示学号。要求输出窗口蓝底,学号和两侧折线,以 白色前景色显示:

 1 assume cs:code, ds:data
 2 data segment
 3     stu_no db '201983290497'
 4     len = $ - stu_no
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax,data
10     mov ds,ax
11     mov ax,0b800h
12     mov es,ax
13     mov si,offset stu_no
14     
15     mov cx,780h
16     mov ah,10h
17     mov al,' '
18     mov bx,0
19 s1:    mov es:[bx],ax        ;将除了最后一行全部染成蓝底空格
20     add bx,2
21     loop s1
22     
23     mov dx,offset print
24     call dx
25     mov cx,len
26     mov ah,17h            ;蓝底白字二进制为00010111,16进制27
27 s3:    mov al,ds:[si]
28     mov es:[bx],ax
29     add bx,2
30     inc si
31     loop s3
32     
33     call dx
34     mov ah,4ch
35     int 21h
36     
37 print:
38     mov cx,22h
39     mov ah,17h
40     mov al,'-'
41 s2:    mov es:[bx],ax
42     add bx,2
43     loop s2    
44     ret
45     
46 code ends
47 end start

 

 

总结

①通过call和ret、寻址方式的综合利用,可以将某一段代码的功能视作函数,在主代码中起到进行调用的功能

②B8000H~BFFFFH显示缓冲区共32KB的空间,80x25彩色模式表示共可以显示25、每行80个字符,在设置b8后的地址是,是从第一行的第一个字符位置开始计算,直到最后一行最后一个字符的位置ff

 

posted on 2021-11-30 22:36  toughm  阅读(91)  评论(3编辑  收藏  举报