四、实验结论
实验任务1
task3_1的源码
assume cs:code, ds:data data segment x db 1, 9, 3 len1 equ $ - x y dw 1, 9, 3 len2 equ $ - y data ends code segment start: mov ax, data mov ds, ax mov si, offset x mov cx, len1 mov ah, 2 s1:mov dl, [si] or dl, 30h int 21h mov dl, ' ' int 21h inc si loop s1 mov ah, 2 mov dl, 0ah int 21h mov si, offset y mov cx, len2/2 mov ah, 2 s2:mov dx, [si] or dl, 30h int 21h mov dl, ' ' int 21h add si, 2 loop s2 mov ah, 4ch int 21h code ends end start
运行结果:输出两行1 9 3
问题①
line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s1其后指令的偏移地址的。
loop1的机器码是E2F2。跳转的位移量是001B-000D=E 即001B+(-E)=000D,位移量为-14
从CPU的角度,E2F2,其中表示位移量的是F2,F代表向前转移,001B+00F2=010D,取后面2位
问题②
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s2其后指令的偏移地址的。loops2的机器指令是E2F0,跳转位移是0039-0029=0010 向前跳转16个字节
从CPU的角度,E2F0,其中表示位移量的是F0,F代表向前转移,0039+00F0=0129,取后面2位
2、实验任务2
tsak3_2的源码
assume cs:code, ds:data data segment dw 200h, 0h, 230h, 0h data ends stack segment db 16 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov word ptr ds:[0], offset s1 mov word ptr ds:[2], offset s2 mov ds:[4], cs mov ax, stack mov ss, ax mov sp, 16 call word ptr ds:[0] s1: pop ax call dword ptr ds:[2] s2: pop bx pop cx mov ah, 4ch int 21h code ends end start
问题①
根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器 (bx) = ? 寄存器(cx) = ? ax = offset s1,即s1的偏移地址;ax=0021h bx = offset s2 ,即s2的偏移地址;bx=0026h cx=cs,即s2的cs值 cx=076C call指令执行时,会将下一条指令的IP入栈 call word ptr ds:[0],将其下一条指令pop ax的IP入栈,然后跳转。所以pop ax中ax保存的是s1的IP call dword ptr ds:[0] 将其下一条指令的cs和IP同时入栈,然后进行跳转。所以pop bx中bx保存的是s2的IP, pop cx中cx保存的是s2的cs值3、实验任务3
编写8086汇编源程序task3_3.asm,在屏幕上以十进制形式输出data段中这一组连续的数据,数据和数据 之间以空格间隔。data segment x db 99, 72, 85, 63, 89, 97, 55 len equ $- x data ends要求: 编写子程序printNumber 功能:以十进制形式输出一个两位数 入口参数:寄存器ax(待输出的数据 --> ax) 出口参数:无 编写子程序printSpace 功能:打印一个空格 入口参数:无 出口参数:无 在主体代码中,综合应用寻址方式和循环,调用printNumber和printSpace, 实现题目要求。
assume cs:code, ds:data data segment x db 99,72,85,63,89,97,55 len equ $ - x data ends code segment start: mov ax,data mov ds,ax mov si,offset x mov cx,len mov byte ptr ds:[10],10 s1: mov ah,0 mov al,ds:[si] div byte ptr ds:[10] call printNumber call printSpace inc si loop s1 mov ah,4ch int 21h printNumber: mov dl,al mov dh,ah or dl,30h mov ah,2 int 21h mov dl,dh or dl,30h int 21h ret printSpace: mov ah,2 mov dl,' ' int 21h ret code ends end start
4、实验任务4
编写8086汇编源程序task3_4.asm,在屏幕上以指定颜色、指定行,在屏幕上输出字符串。
data segment str db 'try' len equ $ - str data ends要求: 编写子程序printStr 功能:在指定行、以指定颜色,在屏幕上显示字符串 入口参数 字符串首字符地址 --> ds:si(其中,字符串所在段的段地址—> ds, 字符串起始地址的偏移地址—> si) 字符串长度 --> cx 字符串颜色 --> bl 指定行 --> bh (取值:0 ~24) 出口参数:无 在主体代码中,两次调用printStr,使得在屏幕最上方以黑底绿字显示字符串,在屏幕最下方以黑 底红色显示字符串
assume cs:code, ds:data data segment str db 'try' len equ $ - str data ends code segment start: mov ax,data mov ds,ax mov si,0 mov bh,0;行号 mov bl,4;颜色 mov cx,len call printStr mov si,0 mov bh,24 mov bl,2 mov cx,len call printStr mov ah,4ch int 21h printStr: mov ax,0b800h;显存地址 mov es,ax mov ax,0 mov al,bh mov dx,160;每行160字符 mul dx mov di,ax s: mov al,ds:[si] mov ah,bl;颜色 mov es:[di],ax inc si add di,2 loop s ret code ends end start
5、实验任务5
在80×25彩色字符模式下,在屏幕最后一行正中间显示学号。要求输出窗口蓝底,学号和两侧折线,以白色前景色显示。 逻辑段定义如下 注*: 1. 80×25彩色字符模式显示缓冲区结构,参见教材「实验9 根据材料编程」里的说明。 2. 编写程序实现时,将data段的学号换成自己的学号。assume cs:code, ds:data data segment stu_no db '201983290029' len = $ - stu_no l2 = 40 - len/2 data ends code segment start: mov ax,data mov ds,ax mov si,0 mov bl,00010001B call printOr mov bl,00010111B call printNo mov ah,4ch int 21h printOr: mov ax,0b800h;显存地址 mov es,ax mov ax,0 mov al,24 mov dx,160; mul dx mov cx,ax s0: mov byte ptr es:[di],' ' mov es:[di+1],bl add di,2 loop s ret printNo: mov ax,0b800h;显存地址 mov es,ax mov ax,0 mov al,24 mov dx,160;每行160个字节 mul dx mov di,ax mov cx,l2;打印- s: mov byte ptr es:[di],'-' mov es:[di+1],bl add di,2 loop s mov si,0 mov cx,len;打印学号 s1: mov al,ds:[si] mov ah,bl;颜色 mov es:[di],ax add di,2 inc si loop s1 mov cx,l2;打印- s2: mov byte ptr es:[di],'-' mov es:[di+1],bl add di,2 loop s2 ret code ends end start
五、实验总结
一个在屏幕上显示的字符,具有前景和背景颜色。属性字节的格式
7 6 5 4 3 2 1 0
BL R G B I R G B
闪烁 背景 高亮 背景