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