王爽汇编语言第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里面。。。求解啊
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了! 大多数东西楼上的已经回答玩了
关于把07E2 mov到ax中,是为了把07E2 mov到ss中,因为ss无法直接mov 必须借用通用寄存器(ax),这个小甲鱼的视频中应该提到很多次了啊~~~ //mov ax,stack;ss比如是07E2,指行指令后会把07E2 mov到ax里面。。。求解啊
额。。吐血。。打错了。。。大神见谅。。应该是这样的。
//mov ax,stack;ss比如是07E2,指行指令后会把07E3 mov到ax里面。。。求解啊 程序被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:} {:2_31:}看懂了。谢谢子夜。 子夜 发表于 2012-6-25 20:20 static/image/common/back.gif
程序被DEBUG载入的时候,程序的地址回给DS段,前256字节是程序的PSP段前缀,主要是DOS和程序通信用,从256字 ...
07E2和07E3相关256个字节吧,怎么加16字节就是07E3了呢{:2_39:}
页:
[1]