Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
C 在汇编函数中获取字符指针_C_Linux_Assembly - Fatal编程技术网

C 在汇编函数中获取字符指针

C 在汇编函数中获取字符指针,c,linux,assembly,C,Linux,Assembly,我需要得到我的字符指针,然后我在屏幕上打印它,看看它是否工作正常。 我从一个文件中读取文本并放入我的字符指针(sizeof(char*)+filesize)+1。。最后,我将“\0”放在。 如果我打印我的字符,那很好 这是我的asm代码 ; void processdata(char* filecontent); section .text global processdata extern printf section .data FORMAT: db '%c', 10, 0

我需要得到我的字符指针,然后我在屏幕上打印它,看看它是否工作正常。 我从一个文件中读取文本并放入我的字符指针(sizeof(char*)+filesize)+1。。最后,我将“\0”放在。 如果我打印我的字符,那很好 这是我的asm代码

; void processdata(char* filecontent);
section .text
    global processdata
    extern printf
section .data
FORMAT: db '%c', 10, 0 ; to break the line 10, 0
processdata:
    push ebp
    mov ebp, esp
    mov ebx, [ebp]
    push ebx
    push FORMAT
    call printf
    add esp, 8
当我运行它时,我只在变量中看到垃圾

正如维奥莱特所说:

; void processdata(char* filecontent);
section .text
        [GLOBAL processdata] ;global processdata 
        extern printf
section .data
FORMAT: db '%c', 0
EQUAL: db "is equal", 10, 0
processdata:

    lea   esi,  [esp]
    mov   ebx,  FORMAT 
oook:   
    mov   eax,  [esi]
    push  eax
    push  ebx 
    call  printf
    inc   esi
    cmp  esi, 0x0
    jnz  oook

谢谢

在linux x86上,第一个函数参数位于
ecx
中。用于打印指针的printf格式是
“%p”

有什么进展吗

    ...
    FORMAT: db '%p', 10, 0 ; to break the line 10, 0
processdata:
    mov eax, [esp+4]
    push eax
    push format
    call printf
    add esp, 8
    ret
如果您的其余代码是正确的,并且您使用的是gcc的调用约定,则应该可以工作

这是假设要打印的指针位于堆栈上

崩溃的原因可能是您在堆栈上推送了12个字节,但只更正了8个堆栈指针。

quote

但是如果我需要增加,我可以这样做吗

使用
char*
的原始函数arg和
%c
格式,如下所示:

    lea   esi,  [esp+4]
    mov   ebx,  FORMAT 
oook:   
    mov   eax,  [esi]
    push  eax
    push  ebx 
    call  printf
    inc   esi
    cmp  [esi], 0x0
    jnz  oook

[编辑:好的,sry,我很快就侵入了一些申子winOS的内联
\uu asm
block]
以下是在linux和nasm中完成的完整操作:

; ----------------------------------------------------------------------------
; blah.asm
; ----------------------------------------------------------------------------  

        extern  printf


        SECTION .data                   ;local variables
        fmt: db "next char:%c", 10, 0   ;printf format, "\n",'0'


        SECTION .text                   ;hack in some codes XD
        global foo

foo:                                    ;foo entry
        push  ebp                       ;set up stack frame
        mov   ebp,esp

        mov   esi, [ebp+8]              ;load the input char array to the source index

oook:                                   ;loop while we have some chars
        push  dword [esi]               ;push next char addy in string to stack
        push  dword fmt                 ;push stored format string to stack

        call  printf

        add   esp, 8                    ;restore stack pointer 
        inc   esi                       ;iterate to next char
        cmp   byte [esi], 0             ;test for null terminator byte 
        jnz   oook

        mov   esp, ebp                  ;restore stack frame
        pop   ebp

        mov   eax,0                     ;return 0
        ret                             ;done

blah.c(调用.asm foo的):



希望它对你有用;)

你希望它显示什么?您正在堆栈上按下
ebx
,它是
[ebp]
,并试图将其显示为
字符。我想这实际上是返回地址。是的,我如何才能得到字符指针,以便可以逐个打印。我有一个字符串,例如“aaaaccaaass”,所以我调用processdata(processString)我想在我的汇编代码中得到它并打印第一个字符a,这样我就可以增加指针并继续打印字符。它会返回一些混乱的字符和分段错误。gcc的调用约定是什么?抱歉,但我第一次使用汇编语言时是如何做到的是的,我明白了。你写的整个程序都是垃圾。不工作,谢谢你的帮助,我会在网上搜索更多。它工作了,我改成%s,它显示了所有的字符串,我怎么能只显示一个字符,我需要逐个比较,但是如果我打印f“%c”或%d,它会打印一个混乱的字符或一个混乱的数字,就像我在原来的帖子中更改的那样?
/*-----------------------------------------------
blah.c
invokes some asm foo
------------------------------------------------*/
#include <stdio.h>

void foo(char*);

int main() {

    char sz[]={"oook\n"};
    foo(sz);

    return 0;
}
$ nasm -f elf blah.asm -o blah.o
$ gcc -o blah blah.c blah.o
$ ./blah
next char:o
next char:o
next char:o
next char:k
next char:

$
$ nasm -v
NASM version 2.09.08 compiled on Apr 30 2011

$ uname -a
Linux violet-313 3.0.0-17-generic #30-Ubuntu SMP Thu Mar 8 17:34:21 UTC 2012 i686 i686 i386 GNU/Linux