实验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     

运行结果:

 

posted @ 2021-11-24 23:35  往年清光  阅读(96)  评论(2)    收藏  举报