1 assume cs:code, ds:data 2 data segment 3 x db 1, 9, 3 4 len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3 5 y dw 1, 9, 3 6 len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9 7 data ends 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov si, offset x ; 取符号x对应的偏移地址0 -> si 13 mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx 14 mov ah, 2 15 s1:mov dl, [si] 16 or dl, 30h 17 int 21h 18 19 mov dl, ' ' 20 int 21h ; 输出空格 21 inc si 22 loop s1 23 mov ah, 2 24 mov dl, 0ah 25 int 21h ; 换行 26 mov si, offset y ; 取符号y对应的偏移地址3 -> si 27 mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx 28 mov ah, 2 29 s2:mov dx, [si] 30 or dl, 30h 31 int 21h 32 mov dl, ' ' 33 int 21h ; 输出空格 34 add si, 2 35 loop s2 36 mov ah, 4ch 37 int 21h 38 code ends 39 end start运行测试截图 问题① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。 反汇编截图: 答:如图所示,E2表示loop,F2表示补码形式的偏移量,转换为二进制为 11110010,再转化成原码为:10001110,对应十进制数-14,所以跳转位移量即为-14。 在执行指令loop s1时的IP为0019,IP+2即为001B,在此基础上加上位移量-14后的IP为000D,从而实现跳转。 问题②line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。 反汇编截图: 答:与问题①步骤相同,F0原码为10010000,对应十进制数为-16,故跳转位移量为-16;对应s2偏移地址为55+2-16=41。 2. 实验任务2 程序源码task3_2.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 start根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax)应该为s1的偏移地址,寄存器(bx)应该为s2的偏移地址,寄存器(cx)应该为cs的段地址。 调试结果界面截图: 调试结果与理论分析结果一致。 3. 实验任务3 程序源码task3_3.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 13 mov si,offset x 14 mov cx,len 15 mov byte ptr ds:[10], 10 16 17 s1: 18 mov ah, 0 19 mov al, ds:[si] 20 div byte ptr ds:[10] 21 22 call printNumber 23 call printSpace 24 25 inc si 26 loop s1 27 28 mov ah,4ch 29 int 21h 30 31 printNumber: 32 mov bx,ax 33 mov ah, 2 34 35 mov dl,al 36 or dl, 30h 37 int 21h 38 39 mov dl,bh 40 or dl,30h 41 int 21h 42 ret 43 printSpace: 44 mov ah, 2 45 mov dl,' ' 46 int 21h 47 ret 48 49 code ends 50 end start运行测试截图:
4. 实验任务4 程序源码task3_4.asm
1 assume ds:data, cs:code 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 13 mov si,0 14 mov cx,len 15 mov bh,0 16 mov bl,00000010B 17 call printStr 18 19 mov si,0 20 mov cx,len 21 mov bh,24 22 mov bl,00000100B 23 call printStr 24 25 mov ax,4c00h 26 int 21h 27 28 29 printStr: 30 mov ax,0b800h 31 mov es,ax 32 33 mov al,bh 34 mov bh,0a0h 35 mul bh 36 mov bp,ax 37 s: 38 mov ah,ds:[si] 39 mov es:[bp],ah 40 inc bp 41 mov es:[bp],bl 42 inc bp 43 inc si 44 loop s 45 ret 46 47 code ends 48 end start运行测试截图: 5. 实验任务5 程序源码task3_5.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运行测试截图: