鱼C论坛

 找回密码
 立即注册
查看: 2366|回复: 4

[已解决]关于书本中ret指令的疑问

[复制链接]
发表于 2020-2-14 15:38:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先看书上的程序吧
[code]assume cs:code
stack segment
     db  16  dup  (0)
stack ends
code segement
        mov ax,4c00h
        int   21h
start: mov ax ,stack
        mov ss,ax
        mov sp,16
        mov ax,0
        push ax
        mov bx,0
        ret
code ends
end start


疑问1.一开始db 16 dup (0)的指令定义一个16个字节的栈空间和mov sp,16有什么联系?这个设置栈偏移地址的操作到底有什么作用?
疑问2.最后的mov bx,0    为什么要写这一条指令(因为完全没有感觉到bx在这个程序中的作用)
疑问3.为什么这个程序在执行完之后(IP)=0?
学到这里突然卡住了,求大佬帮助
最佳答案
2020-2-14 23:42:49
疑问1.一开始db 16 dup (0)的指令定义一个16个字节的栈空间和mov sp,16有什么联系?
          这个设置栈偏移地址的操作到底有什么作用?
         
         db 16 dup(0) ;; 编译器预留16个字节内存单元,16个内存单元全写0
         
         mov ax,stack
         mov ss,ax    ;; ax(stack段地址)写入ss,ss段寄存器不支持直接写入立即数,必须通过ax中介传达
         mov sp,16    ;; 之前在stack段预留了16个字节内存单元,所以sp要写16,指向stack段最末尾字节单元
         
                                  ;; 这几组指令相互配合,在内存空间中预留了16个数值(0)的字节内存单元空间
                                  ;; 并将 SS 栈段指向了预留16个字节内存单元的起始地址, SP 指向预留空间末尾地址
         
         
         
         
疑问2.最后的mov bx,0    为什么要写这一条指令(因为完全没有感觉到bx在这个程序中的作用)

         mov bx,0           ;; 在此程序中毫无作用       

疑问3.为什么这个程序在执行完之后(IP)=0?
学到这里突然卡住了,求大佬帮助

         mov ax,0          ;; ax写0, ax=0
     push ax          ;; 将ax内的数据入栈存储
         *略
         ret                  ;; ret为函数返回指令,一般配合call进行调用
         
                                  ;; call 指令执行步骤:先将 IP 数据写入栈存储,然后跳转到函数程序入口处执行程序
                                  ;; 在程序执行完后,需要返回主程序,此时需要使用ret指令来返回主程序
                                  
                                  ;; ret 指令执行步骤:先出栈,然后将出栈的数据写入IP,返回主程序
                                  
                                  ;; 但现在的程序中,并没有使用过 call 指令,而是使用了 ret 指令
                                  ;; 而在 ret 指令之前的 push ax 指令执行下,此时栈顶中存储的数据为0000
                                  ;; ret 指令执行后,将栈顶的数据0000 出栈写入IP ,所以这个程序执行完后 IP=0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-14 21:32:53 | 显示全部楼层
捞一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 22:26:52 | 显示全部楼层
你一次来3个,让我无从下手
先说第2个吧,mov bx,0
这条指令确实是多余的,删掉也完全可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 23:42:49 | 显示全部楼层    本楼为最佳答案   
疑问1.一开始db 16 dup (0)的指令定义一个16个字节的栈空间和mov sp,16有什么联系?
          这个设置栈偏移地址的操作到底有什么作用?
         
         db 16 dup(0) ;; 编译器预留16个字节内存单元,16个内存单元全写0
         
         mov ax,stack
         mov ss,ax    ;; ax(stack段地址)写入ss,ss段寄存器不支持直接写入立即数,必须通过ax中介传达
         mov sp,16    ;; 之前在stack段预留了16个字节内存单元,所以sp要写16,指向stack段最末尾字节单元
         
                                  ;; 这几组指令相互配合,在内存空间中预留了16个数值(0)的字节内存单元空间
                                  ;; 并将 SS 栈段指向了预留16个字节内存单元的起始地址, SP 指向预留空间末尾地址
         
         
         
         
疑问2.最后的mov bx,0    为什么要写这一条指令(因为完全没有感觉到bx在这个程序中的作用)

         mov bx,0           ;; 在此程序中毫无作用       

疑问3.为什么这个程序在执行完之后(IP)=0?
学到这里突然卡住了,求大佬帮助

         mov ax,0          ;; ax写0, ax=0
     push ax          ;; 将ax内的数据入栈存储
         *略
         ret                  ;; ret为函数返回指令,一般配合call进行调用
         
                                  ;; call 指令执行步骤:先将 IP 数据写入栈存储,然后跳转到函数程序入口处执行程序
                                  ;; 在程序执行完后,需要返回主程序,此时需要使用ret指令来返回主程序
                                  
                                  ;; ret 指令执行步骤:先出栈,然后将出栈的数据写入IP,返回主程序
                                  
                                  ;; 但现在的程序中,并没有使用过 call 指令,而是使用了 ret 指令
                                  ;; 而在 ret 指令之前的 push ax 指令执行下,此时栈顶中存储的数据为0000
                                  ;; ret 指令执行后,将栈顶的数据0000 出栈写入IP ,所以这个程序执行完后 IP=0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-15 12:59:50 | 显示全部楼层
LinuxDeepin 发表于 2020-2-14 23:42
疑问1.一开始db 16 dup (0)的指令定义一个16个字节的栈空间和mov sp,16有什么联系?
          这个设置栈偏移 ...

感谢二位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-29 00:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表