编程语言
首页 > 编程语言> > 实验三 转移指令跳转原理及简单应用编程

实验三 转移指令跳转原理及简单应用编程

作者:互联网

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

 

问题1:反汇编机器码

 

    得到机器码 E2F2 偏移地址即为F2,求补码可得偏移地址为-14

    因为Loop指令的地址是0019,s1开始的地址是000D,Loop指令地址加上指令长度减去s1的地址,偏移量就是-14

 

 

问题2:反汇编机器码

 

        得到机器码 E2F0,偏移量为F0,求补码可得偏移量为-16、

问题3:问题1的截图:                                                                            问题2的截图:

             


 

实验任务2:

问题1: 

 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=0021 BX=0026 CX=???

Debug结果:

 

 

 思考:

  

 

 

       当执行 call指令时,先把当前的IP存起来,当前IP指向下一条命令,地址为0021,于是0021入栈,接着执行POP AX,于是AX的值就是0021

  接着执行call指令,IP指向下一条指令的地址为0026.于是0026入栈,接着执行POP BX. 接着执行POP CX,但此时栈为空,不知道为什么CX的值为076C。

 


实验任务3:

 

 



 

 

 


 

实验任务5:

 1 assume ds:data, cs:code
 2 
 3 data segment
 4     stu_no db '201983290431'
 5     len  = $ - stu_no
 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,07D0h;
15     mov bh,0  
16     mov bl,00010111B;对应蓝底白字
17     call printK
18     mov si,0
19     mov cx,004Fh;
20     mov bh,24  ;绿色字符显示在第24行
21     mov bl,00010111B;对应蓝底白字
22     call printF
23     mov si,0
24     mov cx,len;字符串长度为len赋值给cx
25     mov bh,24  ;绿色字符显示在第24行
26     mov bl,00010111B;对应蓝底白字
27     call printStr
28 
29   
30     mov ax,4c00h
31     int 21h
32 
33 
34     printStr:
35     mov ax,0b800h  ;80*25字符缓冲区
36     mov es,ax
37 
38     mov al,bh
39     mov bh,0a0h   ;一行是160个字节,即a0.总共偏移24行,即24*160个字节
40     mul bh             ;mul默认al和mul后面的寄存器相乘,结果放在ax中
41     add ax,4ah
42     mov bp,ax
43     s:
44     mov ah,ds:[si];每次取出一个字节给ah
45     mov es:[bp],ah;把字母存给显存地址低八位中
46     inc bp
47     mov es:[bp],bl;将颜色信息存入高八位
48     inc bp
49     inc si
50     loop s
51     ret
52 
53     printF:
54     mov ax,0b800h  ;80*25字符缓冲区
55     mov es,ax
56 
57     mov al,bh
58     mov bh,0a0h   ;一行是160个字节,即a0.总共偏移24行,即24*160个字节
59     mul bh     
60     mov bp,ax
61     s1:
62     mov ah,'-';每次取出一个字节给ah
63     mov es:[bp],ah;把字母存给显存地址低八位中
64     inc bp
65     mov es:[bp],bl;将颜色信息存入高八位
66     inc bp
67     inc si
68     loop s1
69     ret
70 
71     printK:
72     mov ax,0b800h  ;80*25字符缓冲区
73     mov es,ax
74 
75     mov al,bh
76     mov bh,0a0h   ;一行是160个字节,即a0.总共偏移24行,即24*160个字节
77     mul bh     
78     mov bp,ax
79     s2:
80     mov ah,' ';每次取出一个字节给ah
81     mov es:[bp],ah;把字母存给显存地址低八位中
82     inc bp
83     mov es:[bp],bl;将颜色信息存入高八位
84     inc bp
85     inc si
86     loop s2
87     ret
88     
89 
90 
91 code ends
92 end start

 

 

标签:24,ah,编程,mov,si,指令,bp,跳转,ax
来源: https://www.cnblogs.com/xiaodaidai666/p/15610641.html