读书人

汇编的几个小问题

发布时间: 2012-03-17 19:06:28 作者: rapoo

汇编的几个问题!
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 ……

读书人网 >单片机

热点推荐