以下是引用wmf2014在2015-9-3 11:03:02的发言:
不是操作系统取此指令,是cpu取此指令。“mov ax,@data”是汇编码,意思是取变量data所在内存区域的段地址到ax寄存器中。汇编代码需要经过编译后成为机器码才能供cpu执行,至于data所在的段地址是多少,需要exe文件重定位后确定。exe文件头会在系统加载后从系统获取一个起始段地址,以这个段地址为基础,定位所有需要浮动的地址(包括跳转、栈等),com类型文件不需要此句。加入编译后的文件加载后数据段地址为1000H,则对应的机器码为"B8 00 10",其中B8为指令,“00 10”为该指令所需要的数据,cpu从内存中取得b8指令后,就会自动从指令后内存中再取两个字节数据,然后把这两个字节数据送到寄存器ax中,这条指令就执行完毕。大概如此了,如果你学过数字脉冲电路,你就比较好理解这个操作过程在电路上是如何操作的,无非是计数器、寄存器、译码器等电路按时序工作而已。
不是操作系统取此指令,是cpu取此指令。“mov ax,@data”是汇编码,意思是取变量data所在内存区域的段地址到ax寄存器中。汇编代码需要经过编译后成为机器码才能供cpu执行,至于data所在的段地址是多少,需要exe文件重定位后确定。exe文件头会在系统加载后从系统获取一个起始段地址,以这个段地址为基础,定位所有需要浮动的地址(包括跳转、栈等),com类型文件不需要此句。加入编译后的文件加载后数据段地址为1000H,则对应的机器码为"B8 00 10",其中B8为指令,“00 10”为该指令所需要的数据,cpu从内存中取得b8指令后,就会自动从指令后内存中再取两个字节数据,然后把这两个字节数据送到寄存器ax中,这条指令就执行完毕。大概如此了,如果你学过数字脉冲电路,你就比较好理解这个操作过程在电路上是如何操作的,无非是计数器、寄存器、译码器等电路按时序工作而已。
多谢指教 程序编成exe文件后 我用二进制编辑器查看文件 文件代码的第一条指令是b8 04 00
然后用debug把程序加载进内存
用d命令查看内存中的代码段
这条指令变成b8 60 07
CPU要执行的就是b8 60 07
0760就是数据段地址。
那个b8 04 00不知去哪里了 如果cpu执行这条 也是把0004这个放到ax里面 显然是操作系统没有把硬盘中二进制执行文件exe的代码段直接拷进内存 而是改变了第一条指令的操作数为分配的内存数据段地址 我估计有个exe文件头里面有个什么东西 让操作系统把数据段地址送到b8后面2个字节
[ 本帖最后由 nooomoon 于 2015-9-3 12:00 编辑 ]