• 5 包含多个段的程序


    包含多个段的程序

    1 LOOP指令

    1.1命令格式

    loop 指令的格式是: loop 标号, CPU 执行loop 指令的时候,要进行两步操作,①(cx)=(cx) - 1 :②判断ex 中的值,不为零则转至标号处执行程序,如果为零则向下执行。

    assume cs:code
    code segment
    	mov ax,2
    	
    	mov cx,11
      s:add ax,ax
        loop s
        
        mov ax,4c00h
        int 21h
    code ends
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 执行mov cx,l l , 设置(cx)= l l;
    2. 执行add ax,ax(第1 次);
    3. 执行loops 将(ex)减1, (cx)=lO, (ex)不为0,所以转至s 处;
    4. 执行add ax,ax(第2 次):
    5. 执行loop s 将(ex)减l, (cx)=9, (ex)不为0,所以转至s 处:
    6. 执行add ax,ax(第3 次);
    7. 执行loops 将(ex)减1, ( cx)=8, (ex)不为0,所以转至s 处:
    8. 执行add ax,ax(第4 次):
    9. 执行loop s 将(ex)减1, (cx)=7, (ex)不为0,所以转至s 处:
    10. 执行add ax,ax(第5 次):
    11. 执行loop s 将(ex)减1, (cx)=6, (ex)不为0,所以转至s 处:
    12. 执行add ax,ax(第6 次):
    13. 执行loop s 将(ex)减1, (ex)斗,(ex)不为0,所以转至s 处:
    14. 执行add ax,ax(第7 次):
    15. 执行loop s 将(ex)减I, (ex)斗,(ex)不为0,所以转至s 处:
    16. 执行add ax,ax(第8 次):
    17. 执行loop s 将(ex)减1, (cx)=3, (ex)不为0,所以转至s 处:
    18. 执行add ax,ax(第9 次):
    19. 执行loop s 将(ex)减1, (ex)弓,(ex)不为0,所以转至s 处:
    20. 执行add ax,ax(第10 次);
    21. 执行loop s 将(ex)减1, (cx)=l, (ex)不为0,所以转至s 处;
    22. 执行add ax,ax(第l l 次):
    23. 执行loop s 将(ex) 减J, ( cx)=O, (ex)为0,所以向下执行。(结束循环)

    2 debug跟踪LOOP指令

    g命令可以执行循环之前的所有指令,跳转到循环指令

    p命令可以直接结束循环

    2.1 debug与编译命令的不同

    在debug中的编程实现:

    mov ax, 2000
    mov ds,ax
    mov al, [OJ
    mov bl, [1]
    mov cl, [2]
    mov dl, [3]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0gFjEJQ-1670244890097)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20221205202318024.png)]

    在源代码中的实现:

    assume cs:code
    code segment
    mov ax, 2000h
    mov ds, ax
    mov al, [OJ
    mov bl, [1]
    mov cl, [2]
    mov dl, [3]
    mov ax , 4c00h
    int 21h
    code ends
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zxUpwn5d-1670244890098)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20221205202431543.png)]

    Debug 和编译器masm 对形如“ movax,[0]”这类指令在解释上的不同。我们在Debug 中和源程序中写入同样形式的指令:“ mov al,[O]”、“ mov bl,[l ]”、“ mov cl,[2]”、“ mov dl,[3]”,但Debug 和编译器对这些指令中的“[idata]”却有不同的解释。Debug 将它解释为"[idata]”是一个内存单元,“ idata ”是内存单元的偏移地址;而编译器将"[idata]”解释为" idata

    要在“[]”的前面显式地给出段地址所在的段寄存器。比如我们可以这样访问2000:0 单元:mov al,ds:[0]

    3 数据段

    dw 即“ define word ” 。在这里,使用dw 定义了8 个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16 个字节。

    程序在运行的时候cs 中存放代码段的段地址,所以可以从cs 中得到它们的段地址。因为用dw 定义的数据处于代码段的最开始,所以偏移地址为0,这8 个数据就在代码段的偏移0 、2 、4、6 、8 、A 、C 、E 处。程序运行时,它们的地址就是CS:O 、CS:2 、cs 炜、CS:6 、CS:8 、CS:A 、CS:C 、CS:E 。

    end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在程序6.2 中我们用end指令指明了程序的入口在标号sta口处,也就是说, “ movbx 。”是程序的第一条指令。

    assume cs:code
    code segment
    	数据
    start;
    	代码
    code ends
    end start
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4 栈段

    assume cs:codesg
    codesg segment
    dw 0123h,0456h,0789h,Oabch,Odefh,Ofedh , Ocbah,0987h
    dW 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    ;用dw 定义16 个字型数据,在程序加载后,将取得16 个字的
    ; 内存空间,存放这16 个数据。在后面的程序中将这段
    ;空间当作钱来使用
    start:mov ax,cs
    mov ss,ax
    mov sp,30h
    ;将设置枝顶ss:sp 指向cs:30
    mov bx,O
    mov cx,8
    s: push cs: [bx]
    add bx , 2
    loop s ;以上将代码段。~ 15 单元中的8 个字型数据依次入战
    mov bx,O
    mov cx,8
    sO: pop cs : [bx]
    add bx,2
    loop sO ;以上依次出钱8 个字型数据到代码段0~ 15 单元中
    mov ax,4c00h
    int 2lh
    codesg ends
    end start 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    将代码段、数据段、栈段分开放置如下:

    assume cs:b,ds:a,ss:c
    
    a segment
    	dw 0123h, 0456h,0789h,Oabch,Odefh,Ofedh,0cbah,0987h
    a ends
    
    c segment
    	dw 0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0
    c ends
    
    b segemnt
    d:  mov ax,c
    	mov ss,ax
    	mov sp,20h     ;希望用c 段当作钱空间,设置ss:sp 指向c:20
    	
    	mov ax,a
    	mov ds,ax      ;希望用d s :bx 访问a 段中的数据, ds 指向a 段
    	
    	mov bx,0
    	mov cx,8
      s:push [bx]      ;以上将a 段中的0 ~ 15 单元中的8 个字型数据依次入技
        add bx,2
        loop s	
        
        mov bx,0
        mov cx,8
     s0:pop [bx]       ;以上依次出战8 个字型数据到a 段的0 ~ 15 单元中
        add bx,2
        loop s0
        
        mov ax,ac00h
        int 21h
    b ends
    end d               ;d 处是要执行的第一条指令,即程序的入口
    
     cx,8
     s0:pop [bx]       ;以上依次出战8 个字型数据到a 段的0 ~ 15 单元中
        add bx,2
        loop s0
        
        mov ax,ac00h
        int 21h
    b ends
    end d               ;d 处是要执行的第一条指令,即程序的入口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    软件测试知识库+1,5款顶级自动化测试工具推荐和使用分析
    LSKA(大可分离核注意力):重新思考CNN大核注意力设计
    c++编程(15)——list的模拟实现
    angular学习-Dom操作
    抖音视频评论采集软件|抖音数据抓取工具
    最强大脑记忆曲线(11)—— 30天结束第一轮复习后的操作
    Ubuntu上安装Docker的步骤和指南
    IP风险查询:抵御DDoS攻击和CC攻击的关键一步
    微盟十年:踩准节奏,持续增长
    [附源码]计算机毕业设计社区生活废品回收APPSpringboot程序
  • 原文地址:https://blog.csdn.net/m0_56773049/article/details/128193179