在x86体系结构中,什么可以使用EAX
而不能使用ESP
?忘记push
和pop
和call
。
尤指由中断隐式异步使用。在现代操作系统中,这只适用于内核堆栈,而不适用于用户空间堆栈。内核代码总是需要在中断被启用时保持ESP有效,并假设它下面的空间在每个指令之后都被清除。
主要(只有?)ESP在用户空间中的异步使用是信号处理程序,因此没有信号处理程序的进程不应该异步使用ESP。(您甚至可以为内核设计一个新的ABI,以传递不强制使用ESP的信号)。
因此,在某些情况下,用户空间代码可以在关键循环中使用ESP作为第8个GP寄存器,否则就会溢出一些东西,但正如文章所指出的,这使得在SEH希望找到有效堆栈的Windows上的调试变得不那么方便。使用MMX或XMM寄存器来保存/还原ESP,因为静态存储不是线程安全的,并且堆栈不可用(鸡/蛋问题)。理论上同样的论点也适用于在64位代码中使用RSP,但是除了RSP之外还有15个Reg,并且保证了SSE2的支持,这使得它不太可能值得。
mov edx, [esp + eax*4] ; legal
mov edx, [eax + esp*4] ; not encodeable
mov edx, [eax + esp] ; assemblers will encode this with esp as the base reg, since neither reg is scaled.
如果我没记错的话,这是ESP just plain不能作为操作数的唯一情况。另一个特殊情况是,ESP作为基寄存器总是需要一个SIB字节,即使没有索引:
mov edx, [eax] ; 2 bytes: opcode + ModRM
mov edx, [ebp] ; 3 bytes: opcode + ModRM + disp8=0 (the other addressing-mode limitation, ebp/rbp and r13 as a base reg needs a displacement; the mode+M encoding that would mean this actually mean something else)
mov edx, [esp] ; 3 bytes: opcode + ModRM + SIB
mov edx, [ebp + 4] ; 3 bytes: opcode + ModRM + disp8
mov edx, [esp + 4] ; 4 bytes: opcode + ModRM + SIB + disp8
mov edx, [ebp + 4 + eax] ; 4 bytes: opcode + ModRM + SIB + disp8
mov edx, [esp + 4 + eax] ; 4 bytes: opcode + ModRM + SIB + disp8
同样值得指出的是,EAX有许多特殊之处,甚至与其他寄存器如ECX相比也是如此。例如,它隐式地与STOS
、CDQ
一起使用,并作为MUL
的操作数(此列表并不详尽)。对于xchg eax,reg
(对于code golf来说很棒,但不是性能!)和使用imm32的普通ALU操作(比如添加eax,imm32
与添加r/m32,imm32
)也有1字节编码。(在线查找这些ALU指令或Intel指令参考手册的原始PDF格式-请参见x86标签wiki以获得链接。)
base 8通用寄存器中唯一一个不是“特殊的”或被任何通用指令隐式使用的是EBX。有关x86寄存器及其名称来源/传统用途的更多信息,请参见http://www.swansontec.com/sregisters.html
ember-app-explorer A CLI tool to explore your Ember.js app folders to make better decisions for yourcode maintainability and modularity. Features View your ember app details like ember-cli version, no
简介 由于Elasticsearch没有提供权限管理功能(官方shield又收费),特开发此Proxy,可以针对Elasticsearch Rest的路径设置权限,可以指定信任IP,支持用户,群组授权 当前版本0.01试用版。 框架基于PHP-Swoole扩展开发,用fast-route库来做http route处理。 安装运行 环境:linux2.6+、php5.5+、mysql5.5+、swo
homebridge-ESP-HSV This is a plugin for homebridge to control an LED strip connected to an ESP8266 chip. It allows adding the ESP8266 as a lightbulb to HomeKit and controlling it with Siri or the Home
esp-homekit-motor Window Motor example of Apple HomeKit accessory serverlibrary. I have only tested it on an esp dev kit attached with a double relay.
所有 Weex 自带组件都支持以下通用样式规则。 WARNING Weex所支持的通用样式已在本文档中全部列出,一些组件可能有自定义样式,请参考组件文档。除此之外的属性,均不被支持。 WARNING Weex 对于长度值目前只支持px和wx(不受屏幕宽度和viewPortWidth影响),不支持相对单位(em、rem)。 盒模型 Weex 盒模型基于 CSS 盒模型,每个 Weex 元素都可视作一
我正在尝试使用AES/EAX/Nopadding执行加密/解密。由于EAX似乎没有BouncyCastle可用,所以BC被添加为提供程序。 null 我有一个AES/GCM/nopadding的实现,它使用了同样的代码,工作得很好。 我做错了什么?