实验3 转移指令跳转原理及其简单应用编程
实验结论
1. 实验任务1
源代码:
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(补码为F2),由标号处的地址 - loop指令后的第一个字节的地址得到,即000D - 001B = 13 - 27 = -14。
问题② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码, 分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得 到跳转后标号s2其后指令的偏移地址的。
调试情况:

答:从机器码可看出跳转的位移量是-16(补码为F0),计算方法同上,0029 - 0039 = 41 - 57 = -16。
2. 实验任务2
源代码:
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
根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = S1的偏移地址 寄存器 (bx) = S2的偏移地址 寄存器(cx) = S2的段地址
验证结果:


由反汇编可知,S1的偏移地址为21H,S2的偏移地址为26H、段地址为076CH,分别对应程序执行到退出前寄存器AX、BX、CX的值,前文分析正确。
3. 实验任务3
源代码:
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 s:mov al, [si] 18 mov ah, 0 19 call printNumber 20 add bx, 2 21 call printSpace 22 inc bx 23 inc si 24 loop s 25 mov ax, 4c00h 26 int 21h 27 28 printNumber: 29 mov dl, 10 30 div dl 31 or al, 30h ;商 32 or ah, 30h ;余数 33 mov dh, ah 34 mov ah, 2 35 mov dl, al 36 int 21h 37 mov dl, dh 38 int 21h 39 ret 40 41 printSpace: 42 mov ah, 2 43 mov dl, ' ' 44 int 21h 45 ret 46 code ends 47 end start
运行结果:

4. 实验任务4
源代码:
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 dh, 0 ;行号 13 mov bl, 2 ;颜色 14 mov si, 0 15 mov ax, 0b800h 16 mov es, ax 17 call printStr 18 19 mov dh, 24 20 mov bl, 4 21 mov si, 0 22 call printStr 23 mov ax, 4c00h 24 int 21h 25 26 printStr: 27 mov al, 160 28 mul dh ;ax存放字符显示的首地址 29 30 mov dx, ax 31 mov al, bl 32 mov bx, dx ;相对寻址只能用bx,bp,si或di 33 34 mov cx, len 35 s:mov dl, [si] 36 mov es:[bx], dl 37 inc bx 38 mov es:[bx], al 39 inc bx 40 inc si 41 loop s 42 ret 43 code ends 44 end start
运行结果:

5. 实验任务5
源代码:
1 assume cs:code, ds:data 2 data segment 3 stu_no db '201983290031' 4 len = $ - stu_no 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov ax, 0b800h 12 mov es, ax 13 14 mov si, 1 15 mov dl, 17h 16 mov cx, 2000 17 bc:mov es:[si], dl 18 add si, 2 19 loop bc 20 21 mov dh, 24 ;行号 22 mov al, 160 23 mul dh 24 mov bx, ax 25 call minus 26 27 mov si, 0 28 mov cx, len 29 s1:mov dl, [si] 30 mov es:[bx], dl 31 add bx, 2 32 inc si 33 loop s1 34 35 call minus 36 mov ax, 4c00h 37 int 21h 38 39 minus: 40 mov dl, '-' 41 mov cx, 34 42 s:mov es:[bx], dl 43 add bx, 2 44 loop s 45 ret 46 code ends 47 end start
运行结果:


浙公网安备 33010602011771号