当前位置: 代码迷 >> 汇编语言 >> 是不是Intel的汇编语言不能定义变量,只有通过伪语言的方法?解决方法
  详细解决方案

是不是Intel的汇编语言不能定义变量,只有通过伪语言的方法?解决方法

热度:5870   发布时间:2013-02-26 00:00:00.0
是不是Intel的汇编语言不能定义变量,只有通过伪语言的方法?
是不是intel   cpu,或者其它的cpu,也就是硬件提供的汇编语言不能定义变量,只有通过伪语言的方法才能定义变量?

而伪语言又是汇编语言编译器提供的,而汇编语言编译器是要在操作系统上运行的

也就是说,没有办法再裸机的情况下编写用变量的汇编程序?

还有,intel   手册上,关于near   call的过程是这样写的

1   Pushes   the   current   value   of   the   EIP   register   on   the   stack
2   Loads   the   offset   of   the   called   procedure   in   the   EIP   register
3   Begins   executions   of   the   procedure

首先把现在的eip压入栈,然后把过程偏移地址放入EIP寄存器。如果有伪指令,我的过程是有标号的,我不需要知道过程在内存中的确切地址。但是如果没有伪指令,也就是说,如果我需要执行一个过程,必须知道它在内存中的真实地址,是吗?

还有,传送指令走数据总线,传送地址走地址总线,是这样的吗?那么,在32位   cpu中,指令长度最多32位,数据长度最多32位,是吗?

------解决方案--------------------------------------------------------
从cpu的角度来看,他看见的只是地址或是一堆地址,你只要告诉他地址他就可以
顺利寻址,汇编器和各种编译器是为了让人更加方便的使用地址中的内容,才出现
你所说的定义变量的伪指令。
------解决方案--------------------------------------------------------
CPU是从cs开始的,偏移量就是ip,每执行一次,就移动一次。
至于变量是有编译器来处理的,针对全局的机器码会提前把那个变量所需的内存地址搞出来,之后会读取该地址。
------解决方案--------------------------------------------------------
1.不知LZ说的变量是否指用local定义的还是?

2.标号地址是编译器计算的,如果不用标号想call某个过程那肯定要知道地址,你可以直接call 地址,也可以把地址放入寄存器call reg,或者压栈用esp定位来call也行,前提都是你要知道地址。

3.读写指令走控制总线,地址走地址总线,数据走数据总线。32位CPU指的是32位数据总线,可以一次处理32 bit。LZ所说的指令长度和数据长度我不太明白。


------解决方案--------------------------------------------------------
所谓变量只是高级语言中引入的比较符合人类语言习惯的一种概念,其本质是对一块固定或非固定的内存区域进行寻址、读写。

高级语言使用变量名作为相应内存区域的标号,掩盖了其底层实现机制。对于CPU而言,绝大部分工作均是在进行寻址和相应的计算,由于处于最底层,故高层的变量操作对于其而言只是众多内存区域寻址,赋值工作的一个普通部分,所以CPU的指令集具有更广义上的应用,也就注定了其机制的简单性(虽然CISC的CPU很多指令并不简单)。

指令走控制总线,地址走地址总线,总线的位宽只是广义上的一次并发传送速率,不代表所能传送的最大位长(可以多次传送),并且记得IA-32 CPU所有的总线并都都只是32-bit的。
------解决方案--------------------------------------------------------
裸机无所谓变量的概念,只有寄存器和RAM的概念,高级语言或者汇编语言编译成的最终目标代码是看不到变量的,只有一个地址。

通常,变量有局部变量,和全局变量的。一般的,高级语言定义的局部变量,编译器用栈来访问,microsoft编译器生成的汇编代码经常是这个样子的. mov eax,[ebp-xx]. 而intel编译器的生成的代码则是这样的: mov eax,[esp+xx].
全局变量总是占用内存空间的,未初始化的全局变量可不占用exe的空间,而初始化的全部变量或者只读变量 则会占用exe文件的空间. masm编译后的文件 只读变量一般放在 rdata的节中,可写变量一般放在data节中.
局部变量只在运行到那个函数时,才使用 sub esp,xx这样的指令分配空间.

在masm32,局部变量用 local 伪操作来定义,全局变量则用 db,dw,dd等来定义.




  相关解决方案