这个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
}
}
二、我给你个例子:
例子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'
.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
首先谢谢 你的回答,可是我所说是调用独立的汇编子程序,而不是这样嵌入到C语言程序中
#5
#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 的效果相同。
首先要清楚一个事实,汇编语言(也可以说机器语言)访问内存单元,无论是数据还是指令,都是通过逻辑地址进行的。
在汇编语言中,为了让程序员能简洁而且准确访问一个内存单元,所以提供了变量名、标号名和过程名等。需要记住,它们都有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
}
}
二、我给你个例子:
例子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'
.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
首先谢谢 你的回答,可是我所说是调用独立的汇编子程序,而不是这样嵌入到C语言程序中
#5
#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 的效果相同。
首先要清楚一个事实,汇编语言(也可以说机器语言)访问内存单元,无论是数据还是指令,都是通过逻辑地址进行的。
在汇编语言中,为了让程序员能简洁而且准确访问一个内存单元,所以提供了变量名、标号名和过程名等。需要记住,它们都有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 的效果相同。