下头的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,有几个地方不是很清楚,请大家指点一下
下面的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,有几个地方不是很清楚,请大家指点一下!
程序如下:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,26 ;这里为什么是26啊 感觉好像是24就可以了 但是不行
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:push [bx]
pop cs:[bx] ;这里也不太清楚
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
我是个初学者希望大家能尽量说清楚一点谢谢了
------解决方案--------------------
SP开始是24是!中间数据转换只需要用一个字来转换!所以LOOP那里SP的变化是从24到22之前变化!
然后退出循环后,使用了INT 21H 也就是中断!
进入中断处理器前还要保留现声场,同时要保护当前的标记位。所以还要用到栈。
而这里要保存的数据量有{ 当前CS段,INT 21H 的下一条指令的IP,当前标记寄存器的值} = 3*2字节。
也就是上面SP从24跳到 24-3*2 = 18 这个位了,就进入INT 21H这里啦!也就是退出程序啦。
再计算一下,sp=18这里并没有来到
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
的0987h这个位置,0987这个位置刚刚好是 0eh
所以总的来讲,程序是从0:0-0:15读出了16字节的数据,并存放到:
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
这16字节的地方中。
也就是MOV SP 24也是可行的!
LZ :"貌似24个运行出来不能10个字单元" 是什么意思 ?
LZ还要保留这10个0吗? 这10个0不是LZ用来做栈空间的吗?
程序如下:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,26 ;这里为什么是26啊 感觉好像是24就可以了 但是不行
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:push [bx]
pop cs:[bx] ;这里也不太清楚
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
我是个初学者希望大家能尽量说清楚一点谢谢了
------解决方案--------------------
SP开始是24是!中间数据转换只需要用一个字来转换!所以LOOP那里SP的变化是从24到22之前变化!
然后退出循环后,使用了INT 21H 也就是中断!
进入中断处理器前还要保留现声场,同时要保护当前的标记位。所以还要用到栈。
而这里要保存的数据量有{ 当前CS段,INT 21H 的下一条指令的IP,当前标记寄存器的值} = 3*2字节。
也就是上面SP从24跳到 24-3*2 = 18 这个位了,就进入INT 21H这里啦!也就是退出程序啦。
再计算一下,sp=18这里并没有来到
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
的0987h这个位置,0987这个位置刚刚好是 0eh
所以总的来讲,程序是从0:0-0:15读出了16字节的数据,并存放到:
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
这16字节的地方中。
也就是MOV SP 24也是可行的!
LZ :"貌似24个运行出来不能10个字单元" 是什么意思 ?
LZ还要保留这10个0吗? 这10个0不是LZ用来做栈空间的吗?