在文件ctype.h,线20,__ismask被定义为:
#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
Run Code Online (Sandbox Code Playgroud)
怎么(int)(unsigned char)(x)办?我猜它会转换x为unsigned char(只检测第一个字节而不管x),但是为什么它会被转换int为最后一个?
对于与编码错误相关的中断,操作系统中断处理程序应该做什么?
例如,我试图除以0来测试我的中断并调用我的中断处理程序.然而,由于DIV指令未成功执行,EIP不会更新到之后的下一个指令,并从中断处理程序返回后用iret,它可以追溯到错误的div指令一次.
mov ax, 3
mov dl, 0
div dl ; go back here again and again
Run Code Online (Sandbox Code Playgroud)
处理此中断的正确方法是什么?我想到的几种方式:
变化dl比0.但是其他别的东西,我不知道如果dl一旦有事能保持,并中断程序应该退出后恢复寄存器,而我不认为默默地提供错误的计算是很好的纠正错误.
之后检索下一条指令div.但是,我没有想到任何简单可靠的方法来获取下一条指令.
修改当前包含返回地址的一些其他的代码地址堆栈的顶部.所以,我们不再回到div教学了.