Fimbulex 发表于 2020-2-14 15:38:53

关于书本中ret指令的疑问

先看书上的程序吧
assume cs:code
stack segment
   db16dup(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?
学到这里突然卡住了,求大佬帮助{:10_266:}

Fimbulex 发表于 2020-2-14 21:32:53

捞一下

人造人 发表于 2020-2-14 22:26:52

你一次来3个,让我无从下手
先说第2个吧,mov bx,0
这条指令确实是多余的,删掉也完全可以

LinuxDeepin 发表于 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

Fimbulex 发表于 2020-2-15 12:59:50

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

感谢二位
页: [1]
查看完整版本: 关于书本中ret指令的疑问