1、从intel的指令代码集我们可以看到与段寄存器有关的有:
MOV mem,segreg
MOV segreg,mem
MOV serreg,reg
很显然,不能把立即数赋值给段寄存器。
DATA SEGMENT作为伪指令,在编译连接过程会被赋一个立即数的值。
2、
MOV SI,OFFSET STR
MOV AX,[SI+2]
这个是没错的。
LEA SI,STR与MOV SI,OFFSET STR最大区别在于OFFSET STR是一条伪指令,与SEG DATA之类相似,它在编译和连接过程被赋给一个值,你可以把它看成一个立即数,LEA SI,STR是把STR的内存指针赋给SI,你可以把它看成内存变量。另外,MOV SI,OFFSET STR是一条2字节立即寻址指令,LEA SI,STR是一条3字节内存寻址指令,后者虽然有比较灵活的寻址方式,但前者具有更小的容量和更快的执行速度,推荐尽可能使用MOV SI,OFFSET STR。当然,OFFSET后面只能是标号或变量名。
1、立即数不能直接传递给段寄存器,例:
xxx dw 2010
....
mov ds,xxx ;允许(xxx是变量)
....
mov ds,2010 ;不允许(2010是立即数)
;===============
2、LEA是计算机指令,在代码执行期它具有计算能力。而OFFSET是伪操作,它只在编译时简单地获取一个变量的地址,在代码执行期它没有计算能力。
例:
MOV BX,OFFSET str ;源代码
如果str的地址是2010,则编译后该行变为:
MOV BX,2010 ;执行代码
下面是允许的:
MOV SI,OFFSET STR
MOV AX,[SI+2]
类似下面是不允许的(这就是“括号里的那段话的意思”):
MOV SI,OFFSET STR + DX
1.MOV AX,DATA 把数据段首地址给AX,而地址在内存里是一个立即数`所以不能直接给段寄存器 要用通用寄存器倒一下.
2.意思是MOV BX,OFFSET [SI+X]
是错的.就是 OFFSET 后面跟的是变量名.而不能是表达式
MOV BX,OFFSET STR str的段偏移 放入BX中
再给你些资料 大家互相学习嘛!
-mov [edi], eax ----把eax的值(dword)赋给位于内存地址edi处的值
2--mov [bp-02], dx ---把dx的值(word)赋给位于内存地址bp-02处的值
3--mov esi,[BP+14] ---把位于内存地址BP+14的dword大小的值移入esi寄存器
4--mov eax, dword ptr [ebp-04]---把位于内存地址ebp-04的dword大小的值移入eax寄存器
5--mov eax, dword ptr[0000003Ah]--把位于内存地址3A的dword大小的值放入eax寄存器
6--mov cl, byte ptr [34h]--把位于内存地址34的byte大小的值放入cl寄存器
7--mov dx, word ptr [3Eh]--把位于内存地址3E的word大小的值放入dx寄存器
8--mov eax,[00403045h] --从内存地址403045读取一个32位的值
9--mov al, byte ptr [eax+ecx]--把位于内存地址eax+ecx的byte大小的值放入al寄存器