悄悄摸过来 发表于 2018-1-23 17:02:31

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

本帖最后由 悄悄摸过来 于 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
mov ah,0
add b,ax
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start

人造人 发表于 2018-1-23 17:23:40

贴代码,不要贴图片

newu 发表于 2018-1-23 18:23:18

==>(1~8以及他们之和)全在es段中<==这句话,1~8的数据本身是在data这个数据段中的,关键是人为的将data放入了es段寄存器。之所以默认是DS应该也就是这个道理吧。

悄悄摸过来 发表于 2018-1-23 19:55:50

newu 发表于 2018-1-23 18:23
==>(1~8以及他们之和)全在es段中

大佬 你的最后一句啥意思 我还是不太懂

人造人 发表于 2018-1-23 21:08:14

assume cs:code, es:data

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

code segment
start:
        mov al, a
       
        mov ax, 4c00h
        int 21h
code ends
end start



D:\Masm615>debug test.exe
-u
0BA9:0000 26            ES:
0BA9:0001 8A840000      MOV   AL,
0BA9:0005 B8004C      MOV   AX,4C00
0BA9:0008 CD21          INT   21
0BA9:000A 0033          ADD   ,DH
0BA9:000C C0            DB      C0
0BA9:000D 26            ES:
0BA9:000E 8A840000      MOV   AL,
0BA9:0012 26            ES:
0BA9:0013 01060800      ADD   ,AX
0BA9:0017 46            INC   SI
0BA9:0018 E2F3          LOOP    000D
0BA9:001A B8004C      MOV   AX,4C00
0BA9:001D CD21          INT   21
0BA9:001F 07            POP   ES
-


0BA9:0000 26            ES:
0BA9:0001 8A840000      MOV   AL,

可以看到有ES前缀

assume cs:code, es:data

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

code segment
start:
        mov al,
       
        mov ax, 4c00h
        int 21h
code ends
end start


D:\Masm615>debug test.exe
-u
0BA9:0000 8A04          MOV   AL,
0BA9:0002 B8004C      MOV   AX,4C00
0BA9:0005 CD21          INT   21
0BA9:0007 4C            DEC   SP
0BA9:0008 CD21          INT   21
0BA9:000A 0033          ADD   ,DH
0BA9:000C C0            DB      C0
0BA9:000D 26            ES:
0BA9:000E 8A840000      MOV   AL,
0BA9:0012 26            ES:
0BA9:0013 01060800      ADD   ,AX
0BA9:0017 46            INC   SI
0BA9:0018 E2F3          LOOP    000D
0BA9:001A B8004C      MOV   AX,4C00
0BA9:001D CD21          INT   21
0BA9:001F 07            POP   ES

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

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

code segment
start:
        mov al,a
       
        mov ax, 4c00h
        int 21h
code ends
end start


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

Assembling: test.asm
test.asm(10) : error A2074: cannot access label through segment registers

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


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

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

没有assume关联寄存器,编译器不知道该如何访问标签a

悄悄摸过来 发表于 2018-1-24 11:31:50

人造人 发表于 2018-1-23 21:08
0BA9:0000 26            ES:
0BA9:0001 8A840000      MOV   AL,



万分感谢 分析很仔细 谢谢大佬{:5_95:}

悄悄摸过来 发表于 2018-1-24 11:54:05

人造人 发表于 2018-1-23 21:08
0BA9:0000 26            ES:
0BA9:0001 8A840000      MOV   AL,



大神 我还有个问题 这个程序中的a和b代表的是什么地址,是偏移地址吗?

人造人 发表于 2018-1-24 16:09:37

悄悄摸过来 发表于 2018-1-24 11:54
大神 我还有个问题 这个程序中的a和b代表的是什么地址,是偏移地址吗?

assume cs:code, ds:data

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

code segment
start:
        mov al,a
        mov al,b
        mov al,c1
       
       
        mov ax, 4c00h
        int 21h
code ends
end start


D:\Masm615>debug test.exe
-u
0BA9:0000 8A840000      MOV   AL,
0BA9:0004 8A840400      MOV   AL,
0BA9:0008 8A840700      MOV   AL,
0BA9:000C B8004C      MOV   AX,4C00
0BA9:000F CD21          INT   21
0BA9:0011 F606569140    TEST    BYTE PTR ,40
0BA9:0016 740F          JZ      0027
0BA9:0018 26            ES:
0BA9:0019 F747022000    TEST    WORD PTR ,0020
0BA9:001E 7407          JZ      0027
-

实验表明是偏移地址

悄悄摸过来 发表于 2018-1-25 11:00:32

人造人 发表于 2018-1-24 16:09
实验表明是偏移地址

好的 以后我也多实验实验
页: [1]
查看完整版本: 请教 关于es和ds的使用问题