变量名到底是变量还是地址?

时间:2023-01-11 22:25:14
  1.如题,例如 COUNT  DB 'ASM'
    这个COUNT到底是变量还是地址,如果说是变量,可是COUNT+1指的却是S,如果说是地址,可是很多时候要得到COUNT的地址使用的却是LEA指令,而不是MOV指令,对于标号名,和过程名也有同样的困惑
2.介绍下VC++6.0下如何实现汇编和C语言的混合编程,我主要弄不清楚如何在C语言中调用汇编子程序,麻烦介绍下这方面的文章,我百度和google都没找到合适的,给个链接就好,谢谢了

6 个解决方案

#1


是你定义的变量在内存单元的首地址

#2


一、应该是地址
二、我给你个例子:
例子1:

单句格式的:

main()


_asm     mov ah,2;
_asm     mov bh,0;
_asm     mov dl, 20;
_asm     mov dh,10;
_asm     int 10h; /*调用BIOS中断设置光标位置*/


模块格式的:

main()


_asm{

mov ah,2
mov bh,0
mov dl, 20
mov dh,10
int 10h

    }



#3


这个问题还真没认真想过,刚才试了一下
.model small
.386
.data
count db 'ASM','$'
.code
start:
mov ax,@data
mov ds,ax

add count,1
lea dx,count
mov ah,09h
int 21h

mov ax,4c00h
int 21h
end start

count + 1后输出的结果是'BSM'

#4


引用 2 楼 leetow2003 的回复:
一、应该是地址
二、我给你个例子:
例子1:

单句格式的:

main()


_asm     mov ah,2;
_asm     mov bh,0;
_asm     mov dl, 20;
_asm     mov dh,10;
_asm     int 10h; /*调用BIOS中断设置光标位置*/


模块格式的:

main()


……

首先谢谢 你的回答,可是我所说是调用独立的汇编子程序,而不是这样嵌入到C语言程序中

#5


该回复于2010-11-10 09:54:52被版主删除

#6


应该理解为地址。

首先要清楚一个事实,汇编语言(也可以说机器语言)访问内存单元,无论是数据还是指令,都是通过逻辑地址进行的。

在汇编语言中,为了让程序员能简洁而且准确访问一个内存单元,所以提供了变量名、标号名和过程名等。需要记住,它们都有3个属性:段属性、偏移地址属性和类型属性。

比如指令 mov count,al ,汇编工具通过其偏移属性使它编译成 mov [xxxx],al 。所以,mov count+1,al就编译成mov [xxxx+1],al

段属性判断是否加段前缀,如编译成 mov [xxxx],al 还是mov es:[xxxx],al

类型属性原来判断2操作数类型是否匹配。(对标号和过程,则是判断是段内还是段间的转移)。



它们的偏移地址本来可以通过运算符offset获得,但为了简洁,提供LEA指令,所以
MOV ax,offset COUNT 与 LEA AX,COUNT 的效果相同。

#1


是你定义的变量在内存单元的首地址

#2


一、应该是地址
二、我给你个例子:
例子1:

单句格式的:

main()


_asm     mov ah,2;
_asm     mov bh,0;
_asm     mov dl, 20;
_asm     mov dh,10;
_asm     int 10h; /*调用BIOS中断设置光标位置*/


模块格式的:

main()


_asm{

mov ah,2
mov bh,0
mov dl, 20
mov dh,10
int 10h

    }



#3


这个问题还真没认真想过,刚才试了一下
.model small
.386
.data
count db 'ASM','$'
.code
start:
mov ax,@data
mov ds,ax

add count,1
lea dx,count
mov ah,09h
int 21h

mov ax,4c00h
int 21h
end start

count + 1后输出的结果是'BSM'

#4


引用 2 楼 leetow2003 的回复:
一、应该是地址
二、我给你个例子:
例子1:

单句格式的:

main()


_asm     mov ah,2;
_asm     mov bh,0;
_asm     mov dl, 20;
_asm     mov dh,10;
_asm     int 10h; /*调用BIOS中断设置光标位置*/


模块格式的:

main()


……

首先谢谢 你的回答,可是我所说是调用独立的汇编子程序,而不是这样嵌入到C语言程序中

#5


该回复于2010-11-10 09:54:52被版主删除

#6


应该理解为地址。

首先要清楚一个事实,汇编语言(也可以说机器语言)访问内存单元,无论是数据还是指令,都是通过逻辑地址进行的。

在汇编语言中,为了让程序员能简洁而且准确访问一个内存单元,所以提供了变量名、标号名和过程名等。需要记住,它们都有3个属性:段属性、偏移地址属性和类型属性。

比如指令 mov count,al ,汇编工具通过其偏移属性使它编译成 mov [xxxx],al 。所以,mov count+1,al就编译成mov [xxxx+1],al

段属性判断是否加段前缀,如编译成 mov [xxxx],al 还是mov es:[xxxx],al

类型属性原来判断2操作数类型是否匹配。(对标号和过程,则是判断是段内还是段间的转移)。



它们的偏移地址本来可以通过运算符offset获得,但为了简洁,提供LEA指令,所以
MOV ax,offset COUNT 与 LEA AX,COUNT 的效果相同。