zz100113 发表于 2020-6-14 07:06:44

汇编实验5 第六题

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 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:}但是对于前面的学习而言

zz100113 发表于 2020-6-14 07:08:12

题目:

zz100113 发表于 2020-6-14 07:13:53

程序如下,编写code 段中的代码, 用push 指令将a 段中的前 8个字型数据,逆序存储到 b段中.   


8个字型数据占用 16个字节.   栈为空指向SP17(十进制)   push 入栈时   先 sp=sp-2   依照前面的知识所学是 没有错的 为何入栈的时候 到004 就中断错误了.

qq990998444 发表于 2020-6-30 03:28:29

额 第二条指令我就没看懂 T题目我也不知道是什么然后就是 定义的是字型数据 也就是说 每个数据占两个字节   b内存当栈使用目前栈为空SP栈顶指针应该是指向 sp=FE+2=49吧 我也是初学者 我瞎BB一下一起研究一起进步

qq990998444 发表于 2020-6-30 03:29:10

sp=EF-2=49输入错了

405794672 发表于 2020-7-1 19:15:02

qq990998444 发表于 2020-6-30 03:29
sp=EF-2=49输入错了

别说你把栈地址弄错了。就说,这EF和FE你从哪里得来的?

qq990998444 发表于 2020-7-2 04:33:12

405794672 发表于 2020-7-1 19:15
别说你把栈地址弄错了。就说,这EF和FE你从哪里得来的?

栈地址确实是弄错了 我也说过我是新手 而且只是瞎BB一下 想跟人讨论研究 不过我想说的其实是 栈空 栈顶指针指的是栈底-1的位置 就是那个假设 当栈中只有一个元素的时候 sp=FE 所以栈为空时sp=FE-2只是我这样理解的当时打错两次被禁言了就没改
然后就是 我是来学习的 你可以教我 但是别用这种说话的方式 显得你情商很低 让我很不想好好回你

405794672 发表于 2020-7-2 08:02:36

qq990998444 发表于 2020-7-2 04:33
栈地址确实是弄错了 我也说过我是新手 而且只是瞎BB一下 想跟人讨论研究 不过我想说的其实是 栈空 栈顶指 ...

你这回复我仍然搞不明白FE是哪来的。还有,对于文字,每个人有不同的理解,而我可以理解出不同的语气。不同语气代表了不同方式。当初我是很疑惑FE是什么东西?没有数据能计算出FE来。上面那句话,在我脑海里是很轻的语气。如同跟熟人讨论问题一样。你的回复,我已经想到了你看到这句话所想象出的我的语气。一定是板着脸吧?我在现实中说话,有很多人是听不见的,你想象一下我即便大吼大叫,那声音音量有多大。

405794672 发表于 2020-7-2 08:05:48

qq990998444 发表于 2020-7-2 04:33
栈地址确实是弄错了 我也说过我是新手 而且只是瞎BB一下 想跟人讨论研究 不过我想说的其实是 栈空 栈顶指 ...

刚才我的又一次回复,我可以明确地告诉你,刚才我在笑。没别的意思,是突然觉得好笑。

qq990998444 发表于 2020-7-3 02:06:49

405794672 发表于 2020-7-2 08:05
刚才我的又一次回复,我可以明确地告诉你,刚才我在笑。没别的意思,是突然觉得好笑。

前面我已经说过了 FE只是我为了理解SP指向的一个假设
算了 告辞 毫无营养

1326631301 发表于 2020-7-17 22:25:57

你的栈段地址是自己分配的,没有让编译器给你分配,也许这段1000:1到1000:16的内存空间里面有操作系统不让动的东西吧

sbx 发表于 2020-8-10 21:01:21

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 09:39:57

本帖最后由 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]
查看完整版本: 汇编实验5 第六题