|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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?
学到这里突然卡住了,求大佬帮助
疑问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
|
|