鱼C论坛

 找回密码
 立即注册
查看: 4005|回复: 8

请教 关于es和ds的使用问题

[复制链接]
发表于 2018-1-23 17:02:31 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 悄悄摸过来 于 2018-1-23 17:49 编辑

默认的数据段存储器不是ds吗,第12行的代码默认的段寄存器为什么用的es而不是ds呢,整个程序运行下来用debug发现数据(1~8以及他们之和)全在es段中,
assume cs:code,es:date
date segment
a db 1,2,3,4,5,6,7,8
b dw 0
date ends
code segment
start:
mov ax,date
mov es,ax
mov si,0
mov cx,8
s:mov al,a[si]
mov ah,0
add b,ax
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start
悄悄摸过来_2018-01-23_16-54-33.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-23 17:23:40 | 显示全部楼层
贴代码,不要贴图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-23 18:23:18 | 显示全部楼层
==>(1~8以及他们之和)全在es段中<==这句话,1~8的数据本身是在data这个数据段中的,关键是人为的将data放入了es段寄存器。之所以默认是DS应该也就是这个道理吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 19:55:50 | 显示全部楼层
newu 发表于 2018-1-23 18:23
==>(1~8以及他们之和)全在es段中

大佬 你的最后一句啥意思 我还是不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-23 21:08:14 | 显示全部楼层
  1. assume cs:code, es:data

  2. data segment
  3.         a db 1, 2, 3, 4, 5, 6, 7, 8
  4.         b dw 0
  5. data ends

  6. code segment
  7. start:
  8.         mov al, a[si]
  9.        
  10.         mov ax, 4c00h
  11.         int 21h
  12. code ends
  13. end start
复制代码


  1. D:\Masm615>debug test.exe
  2. -u
  3. 0BA9:0000 26            ES:
  4. 0BA9:0001 8A840000      MOV     AL,[SI+0000]
  5. 0BA9:0005 B8004C        MOV     AX,4C00
  6. 0BA9:0008 CD21          INT     21
  7. 0BA9:000A 0033          ADD     [BP+DI],DH
  8. 0BA9:000C C0            DB      C0
  9. 0BA9:000D 26            ES:
  10. 0BA9:000E 8A840000      MOV     AL,[SI+0000]
  11. 0BA9:0012 26            ES:
  12. 0BA9:0013 01060800      ADD     [0008],AX
  13. 0BA9:0017 46            INC     SI
  14. 0BA9:0018 E2F3          LOOP    000D
  15. 0BA9:001A B8004C        MOV     AX,4C00
  16. 0BA9:001D CD21          INT     21
  17. 0BA9:001F 07            POP     ES
  18. -
复制代码


0BA9:0000 26            ES:
0BA9:0001 8A840000      MOV     AL,[SI+0000]

可以看到有ES前缀

  1. assume cs:code, es:data

  2. data segment
  3.         a db 1, 2, 3, 4, 5, 6, 7, 8
  4.         b dw 0
  5. data ends

  6. code segment
  7. start:
  8.         mov al,  [si]
  9.        
  10.         mov ax, 4c00h
  11.         int 21h
  12. code ends
  13. end start
复制代码

  1. D:\Masm615>debug test.exe
  2. -u
  3. 0BA9:0000 8A04          MOV     AL,[SI]
  4. 0BA9:0002 B8004C        MOV     AX,4C00
  5. 0BA9:0005 CD21          INT     21
  6. 0BA9:0007 4C            DEC     SP
  7. 0BA9:0008 CD21          INT     21
  8. 0BA9:000A 0033          ADD     [BP+DI],DH
  9. 0BA9:000C C0            DB      C0
  10. 0BA9:000D 26            ES:
  11. 0BA9:000E 8A840000      MOV     AL,[SI+0000]
  12. 0BA9:0012 26            ES:
  13. 0BA9:0013 01060800      ADD     [0008],AX
  14. 0BA9:0017 46            INC     SI
  15. 0BA9:0018 E2F3          LOOP    000D
  16. 0BA9:001A B8004C        MOV     AX,4C00
  17. 0BA9:001D CD21          INT     21
  18. 0BA9:001F 07            POP     ES
复制代码


没有ES前缀,这说明和si寄存器没有关系
然后我又看到了 assume cs:code, es:data
我猜想是不是和这个有关系?试一试
  1. assume cs:code

  2. data segment
  3.         a db 1, 2, 3, 4, 5, 6, 7, 8
  4.         b dw 0
  5. data ends

  6. code segment
  7. start:
  8.         mov al,  a[si]
  9.        
  10.         mov ax, 4c00h
  11.         int 21h
  12. code ends
  13. end start
复制代码

  1. D:\Masm615>ml test.asm
  2. Microsoft (R) Macro Assembler Version 6.15.8803
  3.         Patched for you by promethee [ECL] in the year 2001 - enjoy
  4. Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.

  5. Assembling: test.asm
  6. test.asm(10) : error A2074: cannot access label through segment registers
复制代码


报错了
cannot access label through segment registers
这是什么意思?
我也不知道,有道翻译一下
无标题.png

无法通过段寄存器访问标签

有 assume cs:code, es:data就能编译
这下就明白了吧

没有assume关联寄存器,编译器不知道该如何访问标签a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 11:31:50 | 显示全部楼层
人造人 发表于 2018-1-23 21:08
0BA9:0000 26            ES:
0BA9:0001 8A840000      MOV     AL,[SI+0000]

万分感谢 分析很仔细 谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 11:54:05 | 显示全部楼层
人造人 发表于 2018-1-23 21:08
0BA9:0000 26            ES:
0BA9:0001 8A840000      MOV     AL,[SI+0000]

大神 我还有个问题 这个程序中的a和b代表的是什么地址,是偏移地址吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-24 16:09:37 | 显示全部楼层
悄悄摸过来 发表于 2018-1-24 11:54
大神 我还有个问题 这个程序中的a和b代表的是什么地址,是偏移地址吗?
  1. assume cs:code, ds:data

  2. data segment
  3.         a db 1, 2, 3, 4
  4.         b db 0, 1, 3
  5.         c1 db 4
  6. data ends

  7. code segment
  8. start:
  9.         mov al,  a[si]
  10.         mov al,  b[si]
  11.         mov al,  c1[si]
  12.        
  13.        
  14.         mov ax, 4c00h
  15.         int 21h
  16. code ends
  17. end start
复制代码

  1. D:\Masm615>debug test.exe
  2. -u
  3. 0BA9:0000 8A840000      MOV     AL,[SI+0000]
  4. 0BA9:0004 8A840400      MOV     AL,[SI+0004]
  5. 0BA9:0008 8A840700      MOV     AL,[SI+0007]
  6. 0BA9:000C B8004C        MOV     AX,4C00
  7. 0BA9:000F CD21          INT     21
  8. 0BA9:0011 F606569140    TEST    BYTE PTR [9156],40
  9. 0BA9:0016 740F          JZ      0027
  10. 0BA9:0018 26            ES:
  11. 0BA9:0019 F747022000    TEST    WORD PTR [BX+02],0020
  12. 0BA9:001E 7407          JZ      0027
  13. -
复制代码


实验表明是偏移地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 11:00:32 | 显示全部楼层
人造人 发表于 2018-1-24 16:09
实验表明是偏移地址

好的 以后我也多实验实验
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 21:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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