汇编入门请教

来源:百度知道 编辑:UC知道 时间:2024/05/24 19:12:23
初学汇编,对有些问题不太明白,例如:
写了简单程序
#seeknumber.s
.section .data
msg:
.asciz"having.....\n"
array:
.int 21,38,34,3,4,2,42
count0=(.-array)/4
seeker:
.int 34
.section .text
.globl _start
start:
movl $count0,%eax(这里为什么用”$",下一句为什么不用"$")
movl seeker,%ebx
....
exit
能解释详细点吗,谢了.
不会错的,我是按书上写的,linux平台的GNU环境下的.
shinyix-助理二级 能不能说一下具体$的用法,期待回复.

加了$号的表立即数,count0是个常数,而seeker部分在程序载入内存时是存在于静态存储区的,所以要得到seeker的值需要访问内存,因此无须加$。

立即数就是被编译到程序的二进制文件中的数,换句话说就是在代码编写时你就知道其值,比如:

movl $1, %eax

这里1是个常数,所以要加上$

还有就是对于静态全局变量,在其标号之前加上$意为获得其地址:

output: .asciz "shinyix"

...

_start:
pushl $output #这里$的意思相当于masm里的offset
call printf #调用printf
addl $4, %esp #恢复栈指针
...

由于全局变量也是被编译到程序二进制文件中的,所以他们在被载入到内存中时,相对于程序载入点有一个固定的偏移量,他们的地址也可以被看做是常数,所以在他们的标号前加上$,可以获得其地址。

不知道说清楚了没有,我怎么觉得自己语无伦次...

这是什么汇编啊,是计算机的吗,怎么没见过啊,是不是单片机CPU的专门汇编啊,看不懂

是不是你的上面的程序的变量类型定义的问题啊?