ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-12-02 22:00:06  阅读:114  来源: 互联网

标签:dl 编程 mov si 指令 跳转 ax data ds


三、实验内容 1. 实验任务1  程序源码task3_1.asm 
 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
运行测试截图:

标签:dl,编程,mov,si,指令,跳转,ax,data,ds
来源: https://www.cnblogs.com/MaxWeeeell/p/15606751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有