回 帖 发 新 帖 刷新版面

主题:简单程序中的一些细节问题

NAME EX91
DATA SEGMENT
     STRING DB 1,2,3,4,5,6,7,8,9,10
     SUM DW ?
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      MOV AX,0
      LEA BX,STRING
      MOV CX,10
NEXT:ADD AL,[BX]
     ADC AH,0
     INC BX
     LOOP NEXT
     MOV SUM,AX
     MOV AH,4CH
     INT 21H
CODE ENDS
     END START

我的问题是
1.MOV AX,DATA这条语句到底是把什么传给的AX?
2.MOV AX,DATA
  MOV DS,AX
  这两条语句在这个程序里起到什么作用?我怎么看都没有起到什么作用,请大学帮忙看看

回复列表 (共6个回复)

沙发

1.MOV AX,DATA这条语句到底是把什么传给的AX?
把数据段的首地址送入ax
2.MOV AX,DATA
  MOV DS,AX
  这两条语句在这个程序里起到什么作用?

确定数据的物理地址
当用到程序中用数据时可以找到存储在内存中的数据

板凳

MOV AX,DATA与MOV AX,OFFSET DATA有区别吗?

3 楼

这其实是MASM及TASM弊端.
很容易迷惑初学者, 如果DATA是DATA segment这样定义,mov ax,DATA 就是把DATA表示的段地址赋予ax.
如果是DATA db 14之类的数据变量定义的, 则mov ax, DATA就是将DATA的数值(14)赋予ax.

(这刚好和NASM相反,如果是在NASM里,mov ax, DATA就是将DATA变量偏移地址(offset)赋予ax.)如果要得到DATA偏移地址,就要mov ax, offset DATA或者lea ax, DATA.汇编语言的书上一般都讲的很清楚.

4 楼

seg DATA可以得到DATA的段地址.

5 楼

lea可不是伪操作码, 是真实的CPU指令.
lea可以得到复杂的寻址方式的offset, 比如lea ax, [bx+si+10].
80x86的寻址方式非常多, 你可以仔细查阅相关的汇编手册(当然最全的是Intel的三卷).

6 楼

非常感谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册