陈培伟 发表于 2013-11-8 11:20:04

mov [bx+2],cs 为什么可以实现内存单元与段寄存器的寻址?



(2)补全程序,使jmp指令执行后,CS:IP指向程序的第一条指令。

完整程序如下:
assume cs:code,ds:data

data segment
    dd 12345678h
data ends

code segment
start:mov ax,data
    mov ds,ax
    mov bx,0
    mov ,bx      ;源操作数bx为所填内容
    mov ,cs    ;源操作数cs为所填内容
    jmp dword ptr ds:

code ends
end start


对于 mov ,cs为什么可以实现内存单元与段寄存器的寻址?


仰望天上的光 发表于 2013-11-8 12:26:44

jmp dword ptr ds:
就是让ip = ds:, cs = ds:;
使jmp指令执行后,CS:IP指向程序的第一条指令,就要让ds:=代码段中的cs值, ds: = 程序的第一条指令的偏移地址(就是0)。所以程序用语句
mov ds,ax
   mov bx,0
   mov ,bx
来修改ds:的值为程序的第一条指令的偏移地址(就是0)。
用语句mov ,cs来修改ds:=代码段中的cs值(其实合格不用修改,反正cs的值都没变过)

陈培伟 发表于 2013-11-8 13:24:23

仰望天上的光 发表于 2013-11-8 12:26 static/image/common/back.gif
jmp dword ptr ds:
就是让ip = ds:, cs = ds:;
使jmp指令执行后,CS:IP指向程序的第一条指令,就 ...

对于 mov ,cs为什么可以实现内存单元与段寄存器的寻址?

仰望天上的光 发表于 2013-11-8 16:32:37

陈培伟 发表于 2013-11-8 13:24 static/image/common/back.gif
对于 mov ,cs为什么可以实现内存单元与段寄存器的寻址?

mov ,cs是把段寄存器(就是一种寄存器)的值送到一个内存单元去。至于为什么允许把寄存器送到内存去,这就是8086cpu硬件设计上的事情了,我们可以把它十位一种规定。
就比如你不能用类似mov ds, 123这样把立即数送到段寄存器。这些东西除非你深究8086cpu的内部结构,否则都无法明白本质原因。

ypyangpong 发表于 2013-11-9 17:03:40

不是有call 存储器操作数 这样的语句吗,分开就是push cs:ip,然后jmp 存储器操作数,这个存储器操作数放到了cs:ip中了,也就是说存储器操作数可以直接放到cs中,并没有通过通用寄存器来吧存储器操作数放到cs中的,所以我觉得cs也是个指针寄存器,能直接和存储器操作数交换数据的,,只是我自己的猜测,要弄懂的话真得研究cpu硬件结构,看看cs的地址总线有没有和存储器直接联系着
页: [1]
查看完整版本: mov [bx+2],cs 为什么可以实现内存单元与段寄存器的寻址?