-1

我需要获取我的 char 指针,然后在屏幕上打印它以查看它是否可以正常工作。我从文件中读取文本并放入我的 char 指针 (sizeof(char*) + filesize) + 1.. 最后我放入了 '\0'。如果我 printf 我的 char* 它很好这是我的 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

谢谢

4

2 回答 2

1

引用恶魔之夜

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

使用您的原始函数 arg ofchar*%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


[编辑:好的,对不起,我很快将它破解到一些 shenzi winOS 内联__asm块中]
这是在 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):

/*-----------------------------------------------
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


希望对你有帮助 ;)

于 2012-05-02T19:34:21.993 回答
0

在 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 个。

于 2012-05-02T16:59:50.723 回答