1. 实验任务1
此部分书写内容: 给出程序task1.asm源码,及,运行截图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
回答问题① ① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s1其后指令的偏移地址的。 跳转的位移量是-14 000D-001B=-14(标号处地址-loop指令后的第一个字节地址) 回答问题② ② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s2其后指令的偏移地址的。 跳转的位移量是-16 0029-0039=-16(标号处地址-loop指令后的第一个字节地址) 问题③ ③ 附上上述分析时,在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) = s2的段地址 ② 对源程序进行汇编、链接,得到可执行程序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 ax, 0b800h 13 mov es, ax 14 mov bx,0 15 mov si,0 16 mov cx,len 17 18 s:mov al, [si] 19 mov ah, 0 20 call printNumber 21 add bx, 2 22 call printSpace 23 inc bx 24 inc si 25 loop s 26 mov ax, 4c00h 27 int 21h 28 29 printNumber: 30 mov dl, 10 31 div dl 32 or al, 30h ;商 33 or ah, 30h ;余数 34 mov dh, ah 35 mov ah, 2 36 mov dl, al 37 int 21h 38 mov dl, dh 39 int 21h 40 ret 41 42 printSpace: 43 mov ah, 2 44 mov dl, ' ' 45 int 21h 46 ret 47 48 code ends 49 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 dh, 0 mov bl, 2 mov si, 0 mov ax, 0b800h mov es, ax call printStr mov dh, 24 mov bl, 4 mov si, 0 call printStr mov ax,4c00h int 21h printStr: mov al, 160 mul dh mov dx, ax mov al, bl mov bx, dx mov cx, len s: mov dl, [si] mov es:[bx], dl inc bx mov es:[bx], al inc bx inc si loop s ret code ends end start
运行测试截图 5. 实验任务5 此部分书写内容: 给出程序源码task5.asm
1 assume cs:code, ds:data 2 3 data segment 4 stu_no db '20192375030' 5 len = $ - stu_no 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 15 mov si, 1 16 mov dl, 17h 17 mov cx, 2000 18 bc:mov es:[si], dl 19 add si, 2 20 loop bc 21 22 mov dh, 24 23 mov al, 160 24 mul dh 25 mov bx, ax 26 call minus 27 28 mov si, 0 29 mov cx, len 30 s1:mov dl, [si] 31 mov es:[bx], dl 32 add bx, 2 33 inc si 34 loop s1 35 36 call minus 37 mov ax, 4c00h 38 int 21h 39 40 minus: 41 mov dl, '-' 42 mov cx, 34 43 s:mov es:[bx], dl 44 add bx, 2 45 loop s 46 ret 47 code ends 48 end start运行测试截图
6. 实验总结
a.通过本次实验我掌握了新的指令equ, 举例:COUNT= EQU $-A ;这里的$就是这条指令的偏移地址 (比如是09H), 减去A的偏移地址(比如是01H),那么A的长度 就是08H。
b.打印数字时,实际上是将对应的ASCⅡ值存储到特定位置中,所以可以对字符进行or 30h操作。
c.在屏幕中输出彩色字符,需要先知道显示缓存区的具体位置,显存地址从b800h开始,便宜地址0000-009f对应于第一行。以一个字为单位,低位存储打印的字符或数字,高位存储数字的样式(颜色,背景色,前四位决定背景色和高亮,后四位决定前景色和闪烁,需全屏Dos才能看到)