汇编实验5 第六题
assume cs:codea segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start:mov ax,a
mov es,ax
mov ax,b
mov ds,ax
mov ax,1000H
mov ss,ax
mov sp,17
mov bx,0
mov cx,8
s0:push es:
add bx,2
loop s0
mov bx,0
mov cx,8
s1:pop ds:
add bx,2
loop s1
MOV ax,4c00h
INT 21H
code ends
end start
Debug调试运行到PUSH0004入栈的时候 就出现错误 有大佬知道哪里错了吗..... 只要调大栈顶指针SP 数值 就不会中断错误.{:5_103:}但是对于前面的学习而言 题目: 程序如下,编写code 段中的代码, 用push 指令将a 段中的前 8个字型数据,逆序存储到 b段中.
8个字型数据占用 16个字节. 栈为空指向SP17(十进制) push 入栈时 先 sp=sp-2 依照前面的知识所学是 没有错的 为何入栈的时候 到004 就中断错误了. 额 第二条指令我就没看懂 T题目我也不知道是什么然后就是 定义的是字型数据 也就是说 每个数据占两个字节 b内存当栈使用目前栈为空SP栈顶指针应该是指向 sp=FE+2=49吧 我也是初学者 我瞎BB一下一起研究一起进步 sp=EF-2=49输入错了 qq990998444 发表于 2020-6-30 03:29
sp=EF-2=49输入错了
别说你把栈地址弄错了。就说,这EF和FE你从哪里得来的? 405794672 发表于 2020-7-1 19:15
别说你把栈地址弄错了。就说,这EF和FE你从哪里得来的?
栈地址确实是弄错了 我也说过我是新手 而且只是瞎BB一下 想跟人讨论研究 不过我想说的其实是 栈空 栈顶指针指的是栈底-1的位置 就是那个假设 当栈中只有一个元素的时候 sp=FE 所以栈为空时sp=FE-2只是我这样理解的当时打错两次被禁言了就没改
然后就是 我是来学习的 你可以教我 但是别用这种说话的方式 显得你情商很低 让我很不想好好回你 qq990998444 发表于 2020-7-2 04:33
栈地址确实是弄错了 我也说过我是新手 而且只是瞎BB一下 想跟人讨论研究 不过我想说的其实是 栈空 栈顶指 ...
你这回复我仍然搞不明白FE是哪来的。还有,对于文字,每个人有不同的理解,而我可以理解出不同的语气。不同语气代表了不同方式。当初我是很疑惑FE是什么东西?没有数据能计算出FE来。上面那句话,在我脑海里是很轻的语气。如同跟熟人讨论问题一样。你的回复,我已经想到了你看到这句话所想象出的我的语气。一定是板着脸吧?我在现实中说话,有很多人是听不见的,你想象一下我即便大吼大叫,那声音音量有多大。 qq990998444 发表于 2020-7-2 04:33
栈地址确实是弄错了 我也说过我是新手 而且只是瞎BB一下 想跟人讨论研究 不过我想说的其实是 栈空 栈顶指 ...
刚才我的又一次回复,我可以明确地告诉你,刚才我在笑。没别的意思,是突然觉得好笑。 405794672 发表于 2020-7-2 08:05
刚才我的又一次回复,我可以明确地告诉你,刚才我在笑。没别的意思,是突然觉得好笑。
前面我已经说过了 FE只是我为了理解SP指向的一个假设
算了 告辞 毫无营养 你的栈段地址是自己分配的,没有让编译器给你分配,也许这段1000:1到1000:16的内存空间里面有操作系统不让动的东西吧 assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start:mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,16
mov bx,0
mov cx,8
s:push
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
本帖最后由 xieglt 于 2020-8-12 14:16 编辑
DOS系统是一个开放的系统,没有对内存做任何保护。开放系统的好处就是你可以随意读写
任何一段物理内存,坏处就是你对内存的随意操作可能破坏系统服务程序,导致死机。
比如说,系统里有256个中断服务程序,从0000:0000开始,每4个字节记录着一个中断服务
程序的入口地址,所以0~1023这段内存是不能随意去修改的。当然,还有其他的很多禁区也是
不能随意修改的。
首先,不建议在程序里重新定义栈段,尤其是像
MOVAX,1000H
MOVSS,AX
这样地去定义栈,是非常危险的。因为你不知道1000H*10H 这段内存里到底有没有系统服务程序。
如果有,你的代码就会破坏它。如果一定要自己定义栈,可以如下定义
MY_SS segment
;分配100H 个 WORD 空间,自己预估你需要的栈的大小来分配
DW 100H DUP (0)
MY_SS ends
MOVAX,MY_SS
MOVSS,AX
这样的定义,保证栈始终在你的程序里,不会破坏系统服务程序。
其次DOS系统是16位(2个字节)系统,每执行一条push指令,sp会-2,
因此栈指针要跟2对齐,也就是说是2的整数倍。
mov sp,17
这样的语句是有问题的,可以是16,也可以是18,但不要是奇数。
页:
[1]