Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 指向字符数组_String_Assembly_X86_Stack_Calling Convention - Fatal编程技术网

String 指向字符数组

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

我试图通过将字符串推到堆栈上,将字符串传递给过程。我知道命令行参数类似地被推送到堆栈上,因此为了理解它们,我想制作一个人工原型,将连续的ASCI字符数组推送到堆栈上,并通过调用的过程访问字符串。但是,在运行代码时,我只能通过
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