小编clo*_*0rk的帖子

我可以从堆栈中间弹出吗?

在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上的单联指令,不包括额外的堆栈同步联指令。)

为什么这样做是错误的做法?

x86 assembly callstack abi red-zone

6
推荐指数
1
解决办法
825
查看次数

为什么在检查 0 时使用或代替 cmp

使用“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 / ba % b
首先,我需要检查一个 0 除数。

我的直觉动作是组装

cmp  edx,0
je   InvalidDivisor
Run Code Online (Sandbox Code Playgroud)

但是,当我查看有关汇编程序的高级书籍时,会使用以下内容:

or   edx,edx
jz   InvalidDivisor   
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么第二个解决方案“更正确”?
计算或运算并检查零标志是否比仅比较两个值需要更长的时间?

这只是更高级的编码风格的问题吗?

x86 assembly

4
推荐指数
1
解决办法
2041
查看次数

Python套接字使用错误的端口

为什么我的 python 脚本会这样?
我给它指示通过端口 7777 进行连接,但它超过了 45604。

我没有使用 socket.bind((socket.gethostname(),port))

相反,我与socket.bind(("0.0.0.0",port))
或 一起工作,socket.bind(("127.0.0.1",port))
所以我在这里工作。为什么我的计算机重新路由端口?
应该没有这个必要,不是吗?我可以以某种方式在本地禁用它吗?

在此处输入图片说明

python port networking nat

3
推荐指数
1
解决办法
1110
查看次数

堆溢出的危险?

我有一个关于堆溢出的问题.

我知道如果一个堆栈变量超出它的缓冲区,它可能会覆盖EIP和ESP值,例如,让程序跳转到编码器不希望它跳转的地方.

据我所知,这看起来像是因为向后的小端存储(其中数组中的字符是"向后"存储,从最后到第一个).

另一方面,如果你把那个数组放入堆中,它会与堆栈一起增长,并且你会溢出它,它会将随机垃圾写入空的内存空间吗?
(除非你在solaris上的哪个地方,据我所知有一个大端系统,旁注)
这基本上是危险,因为它只会写入"空白空间"?
所以没有目标跳转到代码不是为其设计的地址和区域?
我弄错了吗?

要指定我的问题:
我正在编写一个程序,用户在通过命令行执行时传递字符串参数和标志,我想知道用户是否可以使用此字符串参数执行hack在具有malloc函数的堆上.

天哪,我希望这个问题不是新手:/请尽量解释简单

感谢您的回答,请在几个小时内见到您,晚安.

c c++ security

2
推荐指数
2
解决办法
1304
查看次数

使用常量是否可以节省内存

我目前正在重构一个我为大学项目写的课程.

这个类把东西放到连接到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位?我弄错了吗?

c++ memory constants arduino

2
推荐指数
1
解决办法
112
查看次数

用C写一个64位程序

这可能是一个非常愚蠢的问题:

  • 如何编写特别针对64位架构的程序.

我们正在开发Solaris系统.

32位和64位的代码本身有什么不同吗?或者它更像是头文件的问题?

任何人都可以给我一个64位的简单hello-username示例?

c 64-bit

-1
推荐指数
1
解决办法
1222
查看次数

标签 统计

assembly ×2

c ×2

c++ ×2

x86 ×2

64-bit ×1

abi ×1

arduino ×1

callstack ×1

constants ×1

memory ×1

nat ×1

networking ×1

port ×1

python ×1

red-zone ×1

security ×1