本期源码,欢迎star:
https://github.com/ZYKWLJ/assembly4-homework
1、题目
为何使用Debug的-t命令,无法显示sp指令?
有如下汇编:
;验证ss和sp的操作是一体的,不可分割的,Debug不能在中间相应单步中断的。
assume cs:codesg
codesg segment
start_:
; 将栈段寄存器ss设置为0000h,栈指针sp设置为0000h,也就是将栈顶设置在0000:0000处。
mov ax,0000h
mov ss,ax
mov sp,0000h
codesg ends
end start_
由上文 每次使用Debug的-t命令都会触发单步中断,显示各个寄存器的值 ,可是为何单独没有mov sp,0000的单步中断操作?

2、分析
直接给出答案:这是为了防止CPU在执行mov ss,ax后,mov sp 0000之前,其他寄存器信息压入栈,这样会导致sp的指向不是正确的栈顶,从而导致出错!
而实际上,触发单步中断过程中,的的确确有寄存器入栈的操作!

所以,ss和sp操作的步骤,必须合为一体,不可分离,CPU内部也设计了屏蔽了ss操作的响应中断的设置,防止压入其他内容,导致sp指向不正确的栈顶。
3、总结
这就是为什么看不见执行mov sp 0000h后,单步中断显示各寄存器状态的输出!因为mov ss, ax执行过程中,压根就屏蔽了各种中断,导致只能执行mov sp, 0000, 既然没有触发中断,何来中断输出呢!

本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。
😉【Linux102】11-kernel/vsprintf.c
😉【Linux102】12-include/stdarg.h
😉【Linux102】14-kernel/system_call.s

最低0.47元/天 解锁文章
1214

被折叠的 条评论
为什么被折叠?



