首页 新闻 会员 周边 捐助

汇编运行中的不解 初学

0
悬赏园豆:5 [待解决问题]
assume cs: codes, ds: data, ss: stack

data segment
    dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
data ends

stack segment
    dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends

codes segment

start:
    mov ax, stack
    mov ss, ax
    mov sp, 16
    mov ax, data
    mov ds, ax

    push ds:[0]
    push ds:[2]

    pop ds:[0]
    pop ds:[2]

    mov ax, 4c00h
    int 21H
codes ends

end start

用的dosbox调试的

开始前的内存

执行第一条语句正常

执行第二条语句就不理解了, 执行完 mov ss, ax就跳到mov ax, data 少了一句 mov sp, 16 但它确实把sp设置成10h

最后看下内存也变了 076b:0里面不知道为什么写了一些东西进去

天不遮我的主页 天不遮我 | 初学一级 | 园豆:66
提问于:2023-04-18 23:44
< >
分享
所有回答(2)
0

第二次 push 操作时,栈溢出了。
你可以将堆栈段的大小设置为 256 字节。
这样写:
stack segment para stack
db 256 dup(?)
stack ends
修改后的代码是这样:
assume cs: codes, ds: data, ss: stack

data segment
dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
data ends

stack segment para stack
db 256 dup(?)
stack ends

codes segment

start:
mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax

push ds:[0]
push ds:[2]

pop ds:[0]
pop ds:[2]

mov ax, 4c00h
int 21H

codes ends

end start

晓月圆舞 | 园豆:142 (初学一级) | 2023-04-19 11:39

我只运行了两句代码 还没到push

支持(0) 反对(0) 天不遮我 | 园豆:66 (初学一级) | 2023-04-19 13:09
0

这段程序是汇编语言代码,目的是将数据段中的两个字存入堆栈,再将它们从堆栈中取出并存回数据段。程序执行完毕后,将会通过调用21H中断退出程序。

关于你提到的问题,可能是因为第二次执行时,寄存器SS和SP的值没有被正确设置,导致程序出现错误。

在第一次执行时,程序通过将堆栈段寄存器SS设置为堆栈段的基地址,将堆栈指针寄存器SP设置为16,以创建堆栈。在第二次执行时,堆栈已经被创建,因此不需要重新设置SS和SP寄存器。

你可以尝试将第二次执行的代码段修改为以下内容,以确保堆栈段寄存器SS和堆栈指针寄存器SP的正确设置:

start:
mov ax, data
mov ds, ax

perl
Copy code
push ds:[0]
push ds:[2]

pop ds:[0]
pop ds:[2]

mov ax, 4c00h
int 21H
这样修改后,程序应该就可以正常执行了。

Technologyforgood | 园豆:7535 (大侠五级) | 2023-04-19 19:01

是我没说清楚 我的意思是这个程序只执行了两条语句 程序没有执行两次

支持(0) 反对(0) 天不遮我 | 园豆:66 (初学一级) | 2023-04-19 19:16

在我的视角 这段程序就执行了
mov ax, stack
mov ss, ax
mov sp, 16
只是设置了栈的基本地址 和sp而已 但是栈的数据被更改了 我不明白这点
程序是利用栈交换数据 最终的结果是对的
只是我不理解 中间的改变

支持(0) 反对(0) 天不遮我 | 园豆:66 (初学一级) | 2023-04-19 19:19

并且我执行完第二条语句mov ss, ax就跳到mov ax, data 少了一句 mov sp, 16 但它确实把sp设置成10h

支持(0) 反对(0) 天不遮我 | 园豆:66 (初学一级) | 2023-04-19 19:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册