一、实验目的
- 理解和掌握转移指令的跳转原理
- 掌握使用call和ret指令实现子程序的方法,理解和掌握其参数传递方式
- 理解和掌握80×25彩色字符模式显示原理
- 综合应用寻址方式和汇编指令完成简单应用编程
二、实验准备
复习教材9-10章:
- 转移指令的跳转原理
- 汇编指令jmp, loop, jcxz, call, ret, retf的用法
三、实验内容
1. 实验任务1
实验的源码以及编译运行结果
-
task1源码
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
loop s1
反汇编跳转的位移是F2,-14,F2是14的补码cpu读取了
loop
指令之后IP变成001B,需要跳转到000D,所以偏移量为-14 -
问题2
loop s2
指令的跳转偏移地址是-16,F0(补码)IP读取完loop指令之后,偏移地址为0039H,跳转的偏移地址是0029H,所以偏移量为-16
2.实验任务2
-
task2.asm源码
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 star
-
给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。
编译结果:
1.ax寄存器的值为21H,bx寄存器的值为26H,cx寄存器的值为076C、
call指令会将ip的地址入栈,所以出栈的是ip的存入地址,给ax
call dword会将cs:ip分别入栈,所以分别出栈赋给了cx,bx;
2和分析结果一致
3.实验任务3
-
task3.asm源码
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 cx,len mov si,0 s: mov ah,0 mov al,[si] mov bx,offset printnumber call bx#调用打印函数 mov bx,offset printSpace call bx#打印空格 inc si loop s mov ah, 4ch int 21h printnumber: mov bl,10#分离个位数和十位数 div bl mov bx,ax mov ah,2 mov dl,bl#打印商 or dl,30h#转成字符 int 21h mov dl,bh#打印余数 or dl,30h#转成字符 int 21h 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 'try' len equ $ - str data ends code segment start: mov ax, data mov ds, ax mov ax,0B800H mov es,ax mov si,offset printStr#第一次打印 mov ah,2#属性颜色 mov bx,0#位移到第一行 call si mov si,offset printStr#第二次打印 mov ah,4 mov bx,0F00H#最后一行 call si mov ah, 4ch int 21h printStr: mov cx,len#打印三个字符 mov si,0 s: mov al,[si] mov es:[bx+si],ax inc si inc bx loop s ret code ends end start
-
运行测试截图
5.实验任务5
-
task5.asm源码
assume cs:code, ds:data data segment stu_no db '201983290498' len = $ - stu_no data ends code segment start: mov ax, data mov ds, ax mov ax,0B800H mov es,ax mov cx,0780H;将除了最后一行的染成蓝色 mov ah,10H mov al,' ' mov bx,0 s: mov es:[bx],ax add bx,2 loop s mov cx,80;打印最后一行横线 mov ah,17H mov al,'-' s1: mov es:[bx],ax add bx,2 loop s1 mov cx,len;打印学号 mov bx,0F44H mov si,0 s2: mov al,[si] mov es:[bx],ax inc si add bx,2 loop s2 mov ah, 4ch int 21h code ends end start
-
运行测试截图