Assembly 使用esp寄存器

Assembly 使用esp寄存器,assembly,x86,stack,nasm,stack-pointer,Assembly,X86,Stack,Nasm,Stack Pointer,我试图理解如何将堆栈与汇编一起使用,在我的尝试中,我在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,

我试图理解如何将堆栈与汇编一起使用,在我的尝试中,我在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,然后通过向ecx指向的内存地址添加48将数字转换为ascii字符来显示该数字。 他能通过“pop-ecx”做同样的事情,然后转换成ascii码吗? 我不太明白作者为什么要这样做。 任何帮助都将不胜感激

他能通过“pop ecx”做同样的事情吗 转换为ascii码


否。sys_write系统调用需要一个指向要打印的字符串的指针。通过将
ecx
推到堆栈上,您可以在
esp
中创建一个指针(地址)

让我们逐行解释代码

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
我想它做的是获取某个值并将其存储在堆栈中,然后将字符串输出到stdout,然后获取先前存储在堆栈中的值并将其添加到所有寄存器中,最后输出它


这也可能有帮助:

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

因此,“add[ecx],DWORD 48”指令将一个DWORD值添加到DS:ecx所指向的地址


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

谢谢您的回答,但为了确保我理解清楚,在“mov ecx,esp”之后,ecx指向存储数字的内存位置,而“添加[ecx],DWORD 48”将向同一内存位置添加48。对吗?
ecx
push
之前存储的内容将在
esp
之后存储在
esp
的地址,如果我错了,请纠正我,但我认为将寄存器括在“add[ecx],DWORD 48”(也称寄存器间接寻址)中的情况,我们在ecx指向的地址上加了48。方括号表示地址的解引用,很像C中的*。内存中的值即将用作指针。