我有一个Linux x86-32 GAS汇编程序终止如下:
movl $1, %eax
movl $0, %ebx # argument for _exit
int $0x80
Run Code Online (Sandbox Code Playgroud)
当我像这样退出时,程序正常运行,但如果我尝试读取stdout输出,我什么也得不到(使用ie less或wc).
我尝试编译一个最小的C程序并比较strace输出.我发现的唯一区别是,GCC使得C程序(int main() { printf("donkey\n"); })隐含地退出exit_group(0)了strace输出.
我尝试修改我的ASM程序以退出call exit而不是原始系统调用.stdout现在可以正常读取.
测试用例
.data
douout: .string "monkey\n"
.text
.globl main
main:
pushl $douout
call printf
# Exit
movl $1, %eax
movl $0, %ebx
int $0x80
Run Code Online (Sandbox Code Playgroud)
编译并运行:
$ yasm -g dwarf2 -f elf -p gas t.asm && gcc -g -melf_i386 -o t t.o && ./t | wc -c
0
Run Code Online (Sandbox Code Playgroud)
预期:
7
Run Code Online (Sandbox Code Playgroud)
编辑:
我打过电话都 …
我尝试printf从我的汇编代码中使用,这是一个应该打印hello到标准输出的最小示例:
.section .rodata
hello:
.ascii "hello\n\0"
.section .text
.globl _start
_start:
movq $hello, %rdi # first parameter
xorl %eax, %eax # 0 - number of used vector registers
call printf
#exit
movq $60, %rax
movq $0, %rdi
syscall
Run Code Online (Sandbox Code Playgroud)
我用
gcc -nostdlib try_printf.s -o try_printf -lc
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它似乎工作:字符串hello被打印出来,退出状态是0:
XXX$ ./try_printf
hello
XXX$ echo $?
0
XXX$
Run Code Online (Sandbox Code Playgroud)
但是当我尝试捕获文本时,很明显,某些内容无法正常工作:
XXX$ output=$(./try_printf)
XXX$ echo $output
XXX$
Run Code Online (Sandbox Code Playgroud)
该变量output应具有 value hello,但为空。
我的用法有printf什么问题?
我最近在我的一个程序集文件的顶部看到了这个,并意识到我在打印整数的过程中花了很多时间使用它而没有真正意识到它最初来自哪里(在我的基本程序集模板中使用)或10,0上结束意味着:
section .data
intfmt: db "%d", 10, 0
Run Code Online (Sandbox Code Playgroud)
任何人都可以打破这个并解释不同的组件,特别是第2行?
我现在正在尝试使用scanf读取输入,看起来这种格式对此没有正常工作.认为这是我学习数字意味着什么的时候了!
另外,如果您对使用scanf在64位架构上读取输入有任何想法,我之前没有这样做,这会导致我一些问题,所以任何指向这样做的指针也会受到赞赏!