programmer 发表于 2012-6-24 20:25:29

王爽汇编语言第6章检测点的一个小问题。

本帖最后由 programmer 于 2012-6-25 19:26 编辑

代码是
assume cs:code,ds:data,ss:stack

data segment

      dw 0123h,0234h,0345h,0456h,0567h,0678h,0789h,089ah

data ends

stack segment

      dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

stack ends

code segment

start:

      mov      ax,stack
      mov      ss,ax
      mov      sp,20h                ;初始栈段

//下面不用看,跟我问题没关系,我想问的是,assume cs:code,ss:stack,ds:data什么作用,为什么
//mov ax,stack;ss比如是07E2,指行指令后会把07E3 mov到ax里面。。。求解啊


子夜 发表于 2012-6-25 10:07:27

assume cs:code,ss:stack,ds:data是伪指令,由编译器解释执行可以理解为 假设,cs=code,ss=stack,ds=data 如果要真的实现CS=code ss=stack ds=data,还是必须让CPU知道。在代码段中设置相应的值就行了。比如 mov ax, data mov ds, ax 这样data就和数据段真正关联了。
至于mov ax,stack   stack是一个标号而已,代表一个地址。mov 是传送指令,就是把stack标号的地址给ax了!

hzhzas 发表于 2012-6-25 16:44:34

大多数东西楼上的已经回答玩了

关于把07E2 mov到ax中,是为了把07E2 mov到ss中,因为ss无法直接mov 必须借用通用寄存器(ax),这个小甲鱼的视频中应该提到很多次了啊~~~

programmer 发表于 2012-6-25 19:26:11

//mov ax,stack;ss比如是07E2,指行指令后会把07E2 mov到ax里面。。。求解啊

额。。吐血。。打错了。。。大神见谅。。应该是这样的。

//mov ax,stack;ss比如是07E2,指行指令后会把07E3 mov到ax里面。。。求解啊

子夜 发表于 2012-6-25 20:20:31

程序被DEBUG载入的时候,程序的地址回给DS段,前256字节是程序的PSP段前缀,主要是DOS和程序通信用,从256字节开始才是程序的入口地址。所以图中可以确定程序的位置DS=07D2H。真正程序的地址就是
07D2H+10H 即 07E2H 是程序的地址。从07E2H开始,然后存放data段数据,stack段数据和code段数据。
data段数据空间是16B,stack占用空间是32B,由于编译器是从上往下编译的。然后07E2就是数据短的起始地址。stack段的起始地址就是07E2加上占用空间的16字节就是07E3了。所以07E3才是ss的段地址了!{:1_1:}

programmer 发表于 2012-6-25 20:36:48

{:2_31:}看懂了。谢谢子夜。

programmer 发表于 2012-6-26 00:08:04

子夜 发表于 2012-6-25 20:20 static/image/common/back.gif
程序被DEBUG载入的时候,程序的地址回给DS段,前256字节是程序的PSP段前缀,主要是DOS和程序通信用,从256字 ...

07E2和07E3相关256个字节吧,怎么加16字节就是07E3了呢{:2_39:}
页: [1]
查看完整版本: 王爽汇编语言第6章检测点的一个小问题。