在x86汇编语言中:
我假设我有一个正常的功能序言,请阅读
push ebp
mov ebp,esp
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过访问内存目标操作数来读取或写入寄存器,假设我想要第一个参数。我会做
mov eax,[ebp +8]
Run Code Online (Sandbox Code Playgroud)
从堆栈中获取一个整数参数。
那为什么我不直接使用stackpointer呢?
add esp,8 ; point ESP at the data we want
pop eax
sub esp,12 ; restore ESP to its original position
Run Code Online (Sandbox Code Playgroud)
这会导致错误吗?在任何情况下都使用吗?
我当然知道第一个操作的大小较小,因为它只是一个操作码,mov而不是三个,但这不是问题的重点。
(编者注:mov eax, [ebp+8]。在x86机器代码的3字节的指令 add/ subESP,imm8指定为3个字节的每个,pop eax是1个字节。
mov eax, [esp+8]是一个4字节的指令:不像在16位寻址模式,ESP可以是一个基址寄存器。但是它确实需要一个SIB字节来对其进行编码。
这些都是现代CPU上的单联指令,不包括额外的堆栈同步联指令。)
为什么这样做是错误的做法?
使用“or”代替“cmp”时是否有主要的积极品质?
考虑这个函数序言:
push ebp
mov ebp,esp
push ebx
xor eax,eax ;error return code
mov ecx,[ebp +8] ;first integer arg after return addr.
mov edx,[ebp +12] ;second integer argument
Run Code Online (Sandbox Code Playgroud)
该函数应计算a / b或a % b。
首先,我需要检查一个 0 除数。
我的直觉动作是组装
cmp edx,0
je InvalidDivisor
Run Code Online (Sandbox Code Playgroud)
但是,当我查看有关汇编程序的高级书籍时,会使用以下内容:
or edx,edx
jz InvalidDivisor
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么第二个解决方案“更正确”?
计算或运算并检查零标志是否比仅比较两个值需要更长的时间?
这只是更高级的编码风格的问题吗?
为什么我的 python 脚本会这样?
我给它指示通过端口 7777 进行连接,但它超过了 45604。
我没有使用 socket.bind((socket.gethostname(),port))
相反,我与socket.bind(("0.0.0.0",port))
或 一起工作,socket.bind(("127.0.0.1",port))
所以我在这里工作。为什么我的计算机重新路由端口?
应该没有这个必要,不是吗?我可以以某种方式在本地禁用它吗?
我有一个关于堆溢出的问题.
我知道如果一个堆栈变量超出它的缓冲区,它可能会覆盖EIP和ESP值,例如,让程序跳转到编码器不希望它跳转的地方.
据我所知,这看起来像是因为向后的小端存储(其中数组中的字符是"向后"存储,从最后到第一个).
另一方面,如果你把那个数组放入堆中,它会与堆栈一起增长,并且你会溢出它,它会将随机垃圾写入空的内存空间吗?
(除非你在solaris上的哪个地方,据我所知有一个大端系统,旁注)
这基本上是危险,因为它只会写入"空白空间"?
所以没有目标跳转到代码不是为其设计的地址和区域?
我弄错了吗?
要指定我的问题:
我正在编写一个程序,用户在通过命令行执行时传递字符串参数和标志,我想知道用户是否可以使用此字符串参数执行hack在具有malloc函数的堆上.
天哪,我希望这个问题不是新手:/请尽量解释简单
感谢您的回答,请在几个小时内见到您,晚安.
我目前正在重构一个我为大学项目写的课程.
这个类把东西放到连接到Arduino Nano的TFT显示器上,我想我不需要解释为什么微处理器上的内存很少见,特别是在Arduino Nanos上....
该类在屏幕上绘制GUI,在重构之前,我曾经为绘制相关的所有内容设置幻数,例如屏幕边缘的偏移量.
我能够重构这种东西
//constants for screen offsets
const int PROGMEM _titleHeight = 30;
const int PROGMEM _leftOffset = 22;
const int PROGMEM _charHeight = 15;
... more stuff here, you get the point
Run Code Online (Sandbox Code Playgroud)
然后我想知道"这真的能省下任何记忆吗?"
我的意思是,最后我使用3个整数单元来实现相同的目标,这是96位"浪费"的空间.
除了它更容易阅读并且无论如何我将这些值填充到PROGMEM中,
使用常量一般会在优化方面节省任何空间吗?
编辑:如果这些值短路,它们的指针不是32位,因此浪费16位?我弄错了吗?
这可能是一个非常愚蠢的问题:
我们正在开发Solaris系统.
32位和64位的代码本身有什么不同吗?或者它更像是头文件的问题?
任何人都可以给我一个64位的简单hello-username示例?