3

我试图了解如何将堆栈与程序集一起使用,并且在尝试中,我在 SO 中的一个问题中遇到了以下代码,即:

push    ecx

mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, result_len
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, esp
add [ecx], DWORD 48
mov edx, 2
int 0x80

在这种情况下,ecx,持有一个数字,作者通过(如果我错了,请纠正我!)首先将堆栈指针移动到 ecx,然后通过将 48 添加到 ecx 所在的内存地址将数字转换为 ascii 字符是指点。他能通过“pop ecx”做同样的事情,然后转换成ascii吗?我不太明白作者为什么要这样写。任何帮助,将不胜感激。

4

3 回答 3

2

他能通过“pop ecx”做同样的事情,然后转换成ascii吗?

不,sys_write 系统调用需要一个指向要打印的字符串的指针。通过压ecx入堆栈,您可以在esp.

于 2014-10-27T03:56:18.617 回答
0

让我们逐行解释代码

push    ecx #ADDS THE VALUE IN THE REGISTER ECX TO THE STACK (TO SAVE IT FOR LATER USE...)

mov eax, 4 #USE stdout AS OUR OUTPUT
mov ebx, 1 #USE stdout AS OUR OUTPUT
mov ecx, result #POINTER TO THE MEMORY ADDRESS OF THE CHARACTERS TO OUTPUT
mov edx, result_len #MAX NUMBER OF CHARACTERS TO SHOW
int 0x80 #EXECUTE THE INTERRUPTION 0X80

mov eax, 4 #USE stdout AS OUR OUTPUT
mov ebx, 1 #USE stdout AS OUR OUTPUT
mov ecx, esp #MOVE THE POINTER FROM THE STACK POINTER OT THE ECX REGISTER THAT LETS US ACCESS EXC IN THE STACK
add [ecx], DWORD 48 #ADDS TO THE VALUE INSIDE OF THE ECX REGISTER THE VALUE OF 48 AS A DWORD TO FIT THE EXTENDED SIZE 
mov edx, 2 #MAX NUMBER OF CHARACTERS TO SHOW
int 0x80

我想这样做是它获取某物的值并将其存储在堆栈中,然后将字符串输出到标准输出,然后获取先前存储在堆栈中的值并将其添加到所有寄存器中 48 最后输出它.

这也可能有帮助:http ://www.tutorialspoint.com/assembly_programming/assembly_system_calls.htm

于 2014-10-27T04:04:53.577 回答
0

如果我们使用 EAX、EBX、ECX 或 EDX 作为括号内的地址寄存器,则 DS 是默认段。但如果我们使用 ESP 或 EBP,那么 SS 是默认段。

所以指令:“add [ecx], DWORD 48”将一个双字值添加到 DS:ECX 指向的地址。

但另外,我们可以在指令中添加一个段覆盖前缀,以便用另一个段覆盖默认段。示例:“添加 SS:[ecx], DWORD 48”。

于 2014-10-27T13:57:38.923 回答