汇编中的名字(标号和变量)

    科技2022-08-31  120

    汇编中的名字(标号和变量)

    前言标号和变量变量标号标号和变量综合总结 一些标号段的名称 codesg 什么是标号(是以前的错话不用看了)


    前言

    汇编中的名字分为标号和变量

    汇编程序中,除了汇编指令和伪指令,还有标号。 名字是符号 汇编中所有的符号都是地址,只不过分为指向数据的地址,指向指令的地址。也就是说,名字项(名字)都是地址。名字也可以叫符号地址。 名字项可以是标号和变量。 标号和变量都是地址。

    有一个简单粗暴的区分方法: f ( x ) = { 有冒号:名字中的标号 无冒号:名字中的变量 f(x)= \begin{cases} \text{有冒号:名字中的标号}\\ \text{无冒号:名字中的变量} \end{cases} f(x)={有冒号:名字中的标号无冒号:名字中的变量

    标号和变量

    名字分为标号和变量

    变量

    这里的LIST明显是一个变量 也就是说,在前面的程序中,一定有相应的变量定义语句,比如

    LIST DB 3 DUP (0) LIST DB 01H

    变量具有三个属性:段基地址、偏移地址和数据类型 而标号有两个属性,段基地址、偏移地址

    变量类似于C语言中的数组名

    DATA_WORD DW 1000,100H,-5

    在这个语句里,DATA_WORD既是第一个元素的地址,又是这一句数据的地址。

    与标号的3个属性相关的数值回送算符分别是 SEG , OFFSET, TYPE 。 例如: MOV AX, SEG X ; 将变量X所在的段地址送入AX MOV BX, OFFSET Y ; 将变量Y的偏移地址送入BX MOV CX, TYPE Z ; 将变量Z的类型值送入CX

    而LEA BX, LIST是使用了变量的偏移地址属性。LEA这个语句的作用就是取偏移地址。 这里利用了变量的地址属性(段地址+偏移地址),就是从BUFF的地址指向的内存单元中取数存到SI里 可以类比于下面的寻址方式

    MOV BX, [1234H]

    这条指令的意思是把1234H当成地址,从这个地址指向的内存单元里取数存入BX(如果是MOV BX, 1234H,那是把1234H这个数存入BX,而[1234H]就是一个地址),其实跟MOV SI, BUFF挺像的。

    并且,MOV SI, BUFF和MOV SI, [BUFF]的效果是一样的。即使你不加[ ],直接写MOV SI, BUFF,人家也知道你要用它的地址属性,加上[ ]也行,都没问题。

    根据变量的三个属性,你也能知道下面这个程序是不对的。 能看出错在哪里吗? 是因为

    MOV AX,[X]

    而报错吗? 再强调一遍,对于变量 MOV AX,X和MOV AX,[X]的效果是一样的。 看看报错 错误提示可以直译为“无效的指令操作数”,这个提示多见于MOV传值时,一般的原因就是操作数长度不匹配 参考博文error A2070:invalid instruction operands 错误原因 X是个变量,变量有数据类型属性。 X的数据类型属性是DB,这个是定义的时候就决定了的。 你把DB类型的数赋给AX,是不行的,MOV的两个操作数类型必须匹配。 按照你之前的想法,X是地址,MOV AX,X是从X这个地址开始取两个字节(一个字)送到AX里。显然这是错的,错就错在X还不仅仅是地址,他还有类型属性。如果

    MOV AL,X

    这样就是没有问题的。

    标号

    标号和变量综合总结

    下面咱们对标号和变量进行比对和说明。

    首先总结一下,标号和变量分别是什么呢? 标号有三个属性,段基地址、偏移地址和类型 变量有三个属性,段基地址、偏移地址和数据类型 一般来说,标号只在代码段中被定义,而变量则可以被定义在数据段和代码段中。 标号的类型属性和变量的类型属性还不太一样。 标号的类型属性用来指出该标号是在本段内引用还是在其他段中引用的。如果是在段内引用的,则称为NEAR,否则为FAR

    变量的3个属性的数值回送算符分别是 SEG , OFFSET, TYPE 。 例如: MOV AX, SEG X ; 将变量X所在的段地址送入AX MOV BX, OFFSET Y ; 将变量Y的偏移地址送入BX MOV CX, TYPE Z ; 将变量Z的类型值送入CX

    看一下PPT上的解释(解释的很好要仔细看) 标号 变量 标号—指向—指令 变量—指向—数据

    下面再看一下例子

    变量

    MOV SI, BUFF

    就是把BUFF送到SI,BUFF代表的就是一个值或者说一个数。

    LEA SI, BUFF

    是取BUFF的偏移地址。

    MOV DATA_WORD, AX

    是把AX的内容送到内存中DATA_WORD所指的单元。

    标号指向内存单元中的指令 这种用法主要就是用来指令跳转 比如说JMP到next或者start这种标号开始的地方

    一些标号

    段的名称 codesg

    codesg只是一个例子。 codesg segment codesg ends codesg就是一个标号,是一个段的名称,这个段的名称最终将被编译,连接程序处理为一个段的段地址(P79) 简单的说: 段名就相当于一个标号,它代表了段地址。

    什么是标号(是以前的错话不用看了)

    下面的“什么是标号”中的内容,也不能说不对,就是说的很模糊。所以不要看。在下面你说标号有两种用法,这是不对的,咱们要以老师PPT上为主,也用标号和变量来说明和学习。所以下面的不要看。 这是老师ppt上的一句话 关于这句话我有一些疑惑。 感谢这篇文章! 10分钟看懂汇编程序

    标号: 指向内存单元的一个符号名,有两种用途,一种用于跳转命令跳转的地址,另一种用于读取或存储指令时访问的内存位置。 在第二种里,符号地址是偏移地址,没有特别说明的话默认在数据段。

    我觉得这是完美的解释! 那么显然

    是第二种用途 buff指向一个内存单元 这条语句把buff所指内存单元中的东西取出来

    其实 这两句显然都不是要用buff来跳转 那么此时就把buff看成指向内存单元的东西 就好比 MOV AX,BX 同样也有 MOV SI,BUFF 你说BX是什么吗,也不是,BX就是一个寄存器的名字 可是在这条语句里,意思就是把BX里的东西和AX里的东西交换 对于BUFF是同样 这又是一种标号的用法。 DATA_WORD指数据段中偏移地址为DATA_WORD的区域。 (没有明确说明,默认在数据段) 把端口28H和29H读到的数据经过AX送到内存中DATA_WORD所指的单元。

    Processed: 0.008, SQL: 9