1. 实验任务
1 此部分书写内容:
给出程序task1.asm源码,及,运行截图
1 assume cs:code, ds:data 2 3 data segment 4 x db 1, 9, 3 5 len1 equ $ - x 6 7 y dw 1, 9, 3 8 len2 equ $ - y 9 data ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov si, offset x 17 mov cx, len1 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 34 mov cx, len2/2 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其后指令的偏移地址的。
位移量:-14
用mov dl [si]的偏移地址000D减去loop s1的偏移地址001B得F2转化为10进制为-14
回答问题②
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s2其后指令的偏移地址的。
位移量:-14
用mov dl [si]的偏移地址0029减去loop s2的偏移地址0037得F2转化为10进制为-14
问题③
③ 附上上述分析时,在debug中进行调试观察的反汇编截图
2. 实验任务2
此部分书写内容:
给出程序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
给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器(bx) = ? 寄存器(cx) = ?
理论分析:ax应该为s1标记对应的偏移地址,bx应该为s2标记对应的偏移地址,cx应该为段地址
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试 结果与理论分析结果是否一致。
与分析结果一致
3. 实验任务3
此部分书写内容:
给出程序源码task3.asm 运行测试截图
1 assume cs:code,ds:data 2 3 data segment 4 x db 99, 72, 85, 63, 89, 97, 55 5 len equ $- x 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 mov si,0 13 mov cx,6 14 s: 15 mov ax,offset printNumber 16 call ax 17 mov ax,offset printSpace 18 call ax 19 loop s 20 mov ah,4ch 21 int 21h 22 23 printNumber: 24 mov ah,0 25 mov al,[si] 26 inc si 27 mov bl,10 28 div bl 29 or al,30h 30 mov bl,al 31 or ah,30h 32 mov bh,ah 33 mov ah,2 34 mov dl,bl 35 int 21h 36 mov ah,2 37 mov dl,bh 38 int 21h 39 ret 40 41 42 printSpace: 43 mov bl,' ' 44 mov ah,2 45 mov dl,bl 46 int 21h 47 ret 48 49 50 code ends 51 end start
4. 实验任务4
此部分书写内容:
给出程序源码task4.asm 运行测试截图
1 assume cs:code,ds:data 2 3 data segment 4 str db 'try' 5 len equ $ - str 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 mov ax,0b800h 13 mov es,ax 14 mov si,0 15 mov di,0 16 mov bl,2 17 mov ax,offset printStr 18 call ax 19 20 mov ax,0b8f0h 21 mov es,ax 22 mov si,0 23 mov di,0 24 mov bl,4 25 mov ax,offset printStr 26 call ax 27 28 29 mov ah, 4ch 30 int 21h 31 32 printStr: 33 mov cx,3 34 s: 35 mov bh,[si] 36 mov es:[di],bh 37 inc di 38 mov es:[di],bl 39 inc si 40 inc di 41 loop s 42 ret 43 44 code ends 45 end start
5. 实验任务5
此部分书写内容:
给出程序源码task5.asm 运行测试截图
1 assume cs:code,ds:data 2 3 data segment 4 stu_no db '20192308063' 5 len = $ - stu_no 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 mov ax,0b8f0h 13 mov es,ax 14 mov si,0 15 mov di,0 16 mov cx,35 17 s: 18 mov byte ptr es:[di],'-' 19 inc di 20 mov byte ptr es:[di],00010111b 21 inc di 22 loop s 23 24 mov cx,11 25 s1: 26 mov bh,[si] 27 inc si 28 mov es:[di],bh 29 inc di 30 mov byte ptr es:[di],00010111b 31 inc di 32 loop s1 33 34 mov cx,34 35 s2: 36 mov byte ptr es:[di],'-' 37 inc di 38 mov byte ptr es:[di],00010111b 39 inc di 40 loop s2 41 42 mov ah, 4ch 43 int 21h 44 45 46 code ends 47 end start
实验总结
这次实验我通过对转移指令的使用进一步理解了转移指令的原理。这一次实验还有一个收获就是对8086cpu的屏幕输出有了进一步了解。在内存空间b8000开始是控制屏幕输出。每一个字代表屏幕上一个字符。前一个字节代表字符assic码值,后一个字节用来控制字符的前景色,背景色,高亮和闪烁的信息。