String 指向字符数组
我试图通过将字符串推到堆栈上,将字符串传递给过程。我知道命令行参数类似地被推送到堆栈上,因此为了理解它们,我想制作一个人工原型,将连续的ASCI字符数组推送到堆栈上,并通过调用的过程访问字符串。但是,在运行代码时,我只能通过String 指向字符数组,string,assembly,x86,stack,calling-convention,String,Assembly,X86,Stack,Calling Convention,我试图通过将字符串推到堆栈上,将字符串传递给过程。我知道命令行参数类似地被推送到堆栈上,因此为了理解它们,我想制作一个人工原型,将连续的ASCI字符数组推送到堆栈上,并通过调用的过程访问字符串。但是,在运行代码时,我只能通过printf格式字符串%c访问单个字符而不是数组。使用格式字符串说明符%s时,我收到一个分段错误。也许我误解了内存寻址的工作原理以及如何正确访问esp所指向的数据。以下是我的尝试: ; assemble and link with: ; nasm -f elf test.as
printf
格式字符串%c
访问单个字符而不是数组。使用格式字符串说明符%s
时,我收到一个分段错误。也许我误解了内存寻址的工作原理以及如何正确访问esp所指向的数据。以下是我的尝试:
; assemble and link with:
; nasm -f elf test.asm && gcc -m32 -o test test.o
section .text
global main
extern printf
some_proc:
push ebp
mov ebp, esp
mov eax, [ebp+8]
push eax
push format_str
call printf
mov esp, ebp ; Deallocate local variables
pop ebp ; Restore the caller’s base pointer value
ret 4
main:
push 0x00796568 ; hey\0
call some_proc
mov eax, 1
int 0x80
section .data
format_str db `%s\n\0` ; <- doesn't work
;format_str db `%c\n\0` <- works
实际标准输出:
Segmentation Fault
如果您在我的代码中看到任何错误,请通知我,我是汇编新手。指令
%s
要求将字符串的地址推送到堆栈上,而不是字符串本身。通过将mov-eax、[ebp+8]
更改为lea-eax、[ebp+8]
来修复代码,以推送字符串的地址。请注意,通常您会通过传递函数的地址而不是将其推到堆栈上来将字符串传递给函数。您通常不会将ESP本身指向数组,除非您滥用pop
来读取性能优于lodsd
或类似于(code golf针对大小和速度进行了优化)。但这通常对字节没有意义。%s
指令要求将字符串的地址推送到堆栈上,而不是字符串本身。通过将mov eax[ebp+8]
更改为lea eax[ebp+8]来修复代码
改为推送字符串的地址。请注意,通常您会通过将字符串的地址传递给函数,而不是通过在堆栈上推送字符串。您通常不会将ESP自身指向数组,除非您滥用pop
来读取比lodsd
或类似的性能更好的数组在中(代码在大小和速度方面都进行了优化)。但这通常对字节来说没有意义。
Segmentation Fault