首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

汇编的几个小问题

2012-03-17 
汇编的几个问题!DSEG SEGMENTNDB 1DSEG ENDSCODE SEGMENTASSUME CS:CODE, DS:DSEGSTART: LEA BX, NMOV CX

汇编的几个问题!
DSEG SEGMENT
N DB 1
DSEG ENDS

CODE SEGMENT
  ASSUME CS:CODE, DS:DSEG

START: LEA BX, N  
  ;MOV CX, N ;此处写为CX 会提示说16位寄存器和8位地址不匹配,那是不是说N是8位地址,CX为16位寄存器,但上面的LEA不是也是这样操作的吗?
  MOV CL, N ;当改为此行代码就对了,但BX,CL的值有什么区别啊?
CODE ENDS
  END START
;;初学者,希望大家帮帮忙!

[解决办法]
LEA是取N的地址,与变量类型没关系,在32位平台下,所有变量的地址都是32位的(即该变量在内存中的位置,如果是64位平台,地址就都是64位的),MOV是复制,N是8位变量,因此目的寄存器不是8位时会有警告信息。
[解决办法]

探讨
刚才看了下,这个问题我不看书就能回答了,LEA我记得好像是取地址,所以 LEA BX, N 应该是取N变量的有效地址,放入BX寄存器,虽然你N定义的是一个字节,但是它的地址依赖于CPU,我记得8086里分段地址和偏移地址的,而MOV的话是将N的内容赋给前面的寄存器,所以一定要和N的长度相匹配。总之,要搞清楚LEA指令和MOV指令的区别,前者是取变量的有效地址,后者是复制变量的值。
比如:mov ……

热点排行