鱼C论坛

 找回密码
 立即注册
查看: 2587|回复: 2

[已解决]关于assume的问题

[复制链接]
发表于 2021-1-20 18:21:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下图是王爽的《汇编语言》的内容,其中书中对于assume的作用是这么描述的,我也去修改了程序中的指令,改成DS:C和SS:A,debug查看结果后,结果也是不变的,那我请问如果这个地方写错误的话,对程序的影响是什么呢,仅仅是为了阅读时方便么?排版可能有点乱,感谢各位了
最佳答案
2021-1-20 22:48:58
本帖最后由 jackz007 于 2021-1-21 00:59 编辑

        代码1:
  1. code segment public para 'code'
  2.         assume cs:code    ; 注意这里
  3. main proc far
  4.         jmp short begin
  5.         d1  dw 01h
  6.         d2  dw 02h
  7.         d3  dw 03h
  8.         d4  dw 04h
  9. begin:  mov ax,code
  10.         mov ds,ax
  11.         mov ax,d1
  12.         mov bx,d2
  13.         mov cx,d3
  14.         mov dx,d4
  15.         mov ax,4c00h
  16.         int 021h
  17. main endp
  18. code ends
  19. end main
复制代码

        代码 2
  1. code segment public para 'code'
  2.         assume cs:code,ds:code    ; 注意这里   
  3. main proc far
  4.         jmp short begin
  5.         d1  dw 01h
  6.         d2  dw 02h
  7.         d3  dw 03h
  8.         d4  dw 04h
  9. begin:  mov ax,code
  10.         mov ds,ax
  11.         mov ax,d1
  12.         mov bx,d2
  13.         mov cx,d3
  14.         mov dx,d4
  15.         mov ax,4c00h
  16.         int 021h
  17. main endp
  18. code ends
  19. end main
复制代码

        编译结果,代码1:
  1. 14B8:0000 EB08          JMP        000A                              
  2. 14B8:0002 0100          ADD        [BX+SI],AX                        
  3. 14B8:0004 0200          ADD        AL,[BX+SI]                        
  4. 14B8:0006 0300          ADD        AX,[BX+SI]                        
  5. 14B8:0008 0400          ADD        AL,00                              
  6. 14B8:000A B8B814        MOV        AX,14B8                           
  7. 14B8:000D 8ED8          MOV        DS,AX                              
  8. 14B8:000F 2E            CS:                      <-- 注意这里                                           
  9. 14B8:0010 A10200        MOV        AX,[0002]     <-- 注意这里                          
  10. 14B8:0013 2E            CS:                      <-- 注意这里                                                      
  11. 14B8:0014 8B1E0400      MOV        BX,[0004]     <-- 注意这里                          
  12. 14B8:0018 2E            CS:                      <-- 注意这里                                           
  13. 14B8:0019 8B0E0600      MOV        CX,[0006]     <-- 注意这里                          
  14. 14B8:001D 2E            CS:                      <-- 注意这里                                           
  15. 14B8:001E 8B160800      MOV        DX,[0008]     <-- 注意这里                          
  16. 14B8:0022 B8004C        MOV        AX,4C00                           
  17. 14B8:0025 CD21          INT        21
复制代码

        编译结果,代码2:
  1. 14B8:0000 EB08          JMP        000A                              
  2. 14B8:0002 0100          ADD        [BX+SI],AX                        
  3. 14B8:0004 0200          ADD        AL,[BX+SI]                        
  4. 14B8:0006 0300          ADD        AX,[BX+SI]                        
  5. 14B8:0008 0400          ADD        AL,00                              
  6. 14B8:000A B8B814        MOV        AX,14B8                           
  7. 14B8:000D 8ED8          MOV        DS,AX                              
  8. 14B8:000F A10200        MOV        AX,[0002]     <-- 注意这里                          
  9. 14B8:0012 8B1E0400      MOV        BX,[0004]     <-- 注意这里                          
  10. 14B8:0016 8B0E0600      MOV        CX,[0006]     <-- 注意这里                          
  11. 14B8:001A 8B160800      MOV        DX,[0008]     <-- 注意这里                          
  12. 14B8:001E B8004C        MOV        AX,4C00                           
  13. 14B8:0021 CD21          INT        21                              
复制代码

        代码 1 和 代码 2 几乎完全相同,唯一的不同就是 assume 伪指令有差别,从编译结果中看出区别了?代码 1 没有把 ds 寄存器与需要访问数据所在的段进行绑定,编译器只好通过 cs 寄存器来对数据进行索引,而代码 2 把 ds 寄存器与需要访问数据所在的段进行了绑定,情况就如我们所愿了。这就是 assume 伪指令的重要作用。
图像.jpeg
图像 2.jpeg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-20 22:48:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-21 00:59 编辑

        代码1:
  1. code segment public para 'code'
  2.         assume cs:code    ; 注意这里
  3. main proc far
  4.         jmp short begin
  5.         d1  dw 01h
  6.         d2  dw 02h
  7.         d3  dw 03h
  8.         d4  dw 04h
  9. begin:  mov ax,code
  10.         mov ds,ax
  11.         mov ax,d1
  12.         mov bx,d2
  13.         mov cx,d3
  14.         mov dx,d4
  15.         mov ax,4c00h
  16.         int 021h
  17. main endp
  18. code ends
  19. end main
复制代码

        代码 2
  1. code segment public para 'code'
  2.         assume cs:code,ds:code    ; 注意这里   
  3. main proc far
  4.         jmp short begin
  5.         d1  dw 01h
  6.         d2  dw 02h
  7.         d3  dw 03h
  8.         d4  dw 04h
  9. begin:  mov ax,code
  10.         mov ds,ax
  11.         mov ax,d1
  12.         mov bx,d2
  13.         mov cx,d3
  14.         mov dx,d4
  15.         mov ax,4c00h
  16.         int 021h
  17. main endp
  18. code ends
  19. end main
复制代码

        编译结果,代码1:
  1. 14B8:0000 EB08          JMP        000A                              
  2. 14B8:0002 0100          ADD        [BX+SI],AX                        
  3. 14B8:0004 0200          ADD        AL,[BX+SI]                        
  4. 14B8:0006 0300          ADD        AX,[BX+SI]                        
  5. 14B8:0008 0400          ADD        AL,00                              
  6. 14B8:000A B8B814        MOV        AX,14B8                           
  7. 14B8:000D 8ED8          MOV        DS,AX                              
  8. 14B8:000F 2E            CS:                      <-- 注意这里                                           
  9. 14B8:0010 A10200        MOV        AX,[0002]     <-- 注意这里                          
  10. 14B8:0013 2E            CS:                      <-- 注意这里                                                      
  11. 14B8:0014 8B1E0400      MOV        BX,[0004]     <-- 注意这里                          
  12. 14B8:0018 2E            CS:                      <-- 注意这里                                           
  13. 14B8:0019 8B0E0600      MOV        CX,[0006]     <-- 注意这里                          
  14. 14B8:001D 2E            CS:                      <-- 注意这里                                           
  15. 14B8:001E 8B160800      MOV        DX,[0008]     <-- 注意这里                          
  16. 14B8:0022 B8004C        MOV        AX,4C00                           
  17. 14B8:0025 CD21          INT        21
复制代码

        编译结果,代码2:
  1. 14B8:0000 EB08          JMP        000A                              
  2. 14B8:0002 0100          ADD        [BX+SI],AX                        
  3. 14B8:0004 0200          ADD        AL,[BX+SI]                        
  4. 14B8:0006 0300          ADD        AX,[BX+SI]                        
  5. 14B8:0008 0400          ADD        AL,00                              
  6. 14B8:000A B8B814        MOV        AX,14B8                           
  7. 14B8:000D 8ED8          MOV        DS,AX                              
  8. 14B8:000F A10200        MOV        AX,[0002]     <-- 注意这里                          
  9. 14B8:0012 8B1E0400      MOV        BX,[0004]     <-- 注意这里                          
  10. 14B8:0016 8B0E0600      MOV        CX,[0006]     <-- 注意这里                          
  11. 14B8:001A 8B160800      MOV        DX,[0008]     <-- 注意这里                          
  12. 14B8:001E B8004C        MOV        AX,4C00                           
  13. 14B8:0021 CD21          INT        21                              
复制代码

        代码 1 和 代码 2 几乎完全相同,唯一的不同就是 assume 伪指令有差别,从编译结果中看出区别了?代码 1 没有把 ds 寄存器与需要访问数据所在的段进行绑定,编译器只好通过 cs 寄存器来对数据进行索引,而代码 2 把 ds 寄存器与需要访问数据所在的段进行了绑定,情况就如我们所愿了。这就是 assume 伪指令的重要作用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-21 10:37:27 | 显示全部楼层
jackz007 发表于 2021-1-20 22:48
代码1:

        代码 2

感谢 感谢  我再去理解理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 19:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表