当前位置: 技术问答>linux和unix
Oragne'S
来源: 互联网 发布时间:2016-09-02
本文导语: 最近在看于渊的Oragne'S。 mov ax, cs ;cs段初始值是零 mov ds, ax ;ds段置零 mov es, ax ;es段置零 mov ss, ax ;ss段置零 mov sp...
最近在看于渊的Oragne'S。
mov ax, cs ;cs段初始值是零
mov ds, ax ;ds段置零
mov es, ax ;es段置零
mov ss, ax ;ss段置零
mov sp, 0100h ;在实模式下,是为了各个段共用一个段基址。赋值给sp是初始化栈指针,
; 初始化 32 位代码段描述符
xor eax, eax ;eax 寄存器置零
mov ax, cs ;把代码段的地址放到ax
shl eax, 4 ;由于eax 是32位的,相当于把ax的值放到了高16位
;此时的eax里是段地址
add eax, LABEL_SEG_CODE32 ; 32位代码段的物理地址 ,相当于段基地址+32位偏移地址
问题1:cs的值开始时应该是0000:7c00的基地址0000,xor eax, eax 使得eax = 0,那么shl eax, 4 还有何意义?寄存器值为零还有移位的必要吗?
问题2:xor eax, eax 是eax=0,为什么不用mov eax,0h呢?
mov ax, cs ;cs段初始值是零
mov ds, ax ;ds段置零
mov es, ax ;es段置零
mov ss, ax ;ss段置零
mov sp, 0100h ;在实模式下,是为了各个段共用一个段基址。赋值给sp是初始化栈指针,
; 初始化 32 位代码段描述符
xor eax, eax ;eax 寄存器置零
mov ax, cs ;把代码段的地址放到ax
shl eax, 4 ;由于eax 是32位的,相当于把ax的值放到了高16位
;此时的eax里是段地址
add eax, LABEL_SEG_CODE32 ; 32位代码段的物理地址 ,相当于段基地址+32位偏移地址
问题1:cs的值开始时应该是0000:7c00的基地址0000,xor eax, eax 使得eax = 0,那么shl eax, 4 还有何意义?寄存器值为零还有移位的必要吗?
问题2:xor eax, eax 是eax=0,为什么不用mov eax,0h呢?
|
问题2:刚搜了一下,有两个说法
1. xor eax, eax 指令比 mov eax,0h 短一些。
这个要查一下指令集。不过我觉得这很可能是对的,mov eax,0h 这里面有4个字节的立即数,显然浪费。
2. 关于执行速度,有人说xor比较快,有人说一样。这个我不太确定。
1. xor eax, eax 指令比 mov eax,0h 短一些。
这个要查一下指令集。不过我觉得这很可能是对的,mov eax,0h 这里面有4个字节的立即数,显然浪费。
2. 关于执行速度,有人说xor比较快,有人说一样。这个我不太确定。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。