【问题标题】:How do a library function (C) call on gnu assembly language?库函数 (C) 如何调用 gnu 汇编语言?
【发布时间】:2013-04-15 10:14:28
【问题描述】:

我编译了一个代码。

.data
ssttrr:
.string "%d\n"
.text
.globl main
main:
mov $213, %rdx
push %rdx
push $ssttrr
call _printf
add  $8, %rsp

或者它

.global main

    .text
main:

push    %rax                    # caller-save register
push    %rcx                    # caller-save register

mov     $format, %rdi           # set 1st parameter (format)
mov     %rax, %rsi              # set 2nd parameter (current_number)
xor     %rax, %rax              # because printf is varargs
call    printf                  # printf(format, current_number)

pop     %rcx                    # restore caller-save register
pop     %rax                    # restore caller-save register

mov     %rax, %rdx              # save the current number
mov     %rbx, %rax              # next number is now current
add     %rdx, %rbx              # get the new next number
dec     %ecx                    # count down
jnz     print                   # if not done counting, do some more

pop     %rbx                    # restore rbx before returning


mov  $60, %rax
xor  %rdi, %rdi
syscall

format:
    .asciz  "%20ld\n"

为什么“格式”在 .text 字段中?

gcc -nostdlib file.s -o program

为什么会出错?

/universe/earth/asm/file.s:14: 未定义对 `_printf' 的引用 collect2: ld 返回 1 个退出状态

如何解决这个错误?

如果是这样,那么所有代码​​都可以工作。为什么???

.global main

    .text
main:
    push    %rbx                    # we have to save this since we use it

    mov     $90, %ecx               # ecx will countdown to 0
    xor     %rax, %rax              # rax will hold the current number
    xor     %rbx, %rbx              # rbx will hold the next number
    inc     %rbx                    # rbx is originally 1
print:
    # We need to call printf, but we are using eax, ebx, and ecx.  printf
    # may destroy eax and ecx so we will save these before the call and
    # restore them afterwards.

    push    %rax                    # caller-save register
    push    %rcx                    # caller-save register

    mov     $format, %rdi           # set 1st parameter (format)
    mov     %rax, %rsi              # set 2nd parameter (current_number)
    xor     %rax, %rax              # because printf is varargs
    call    printf                  # printf(format, current_number)

    pop     %rcx                    # restore caller-save register
    pop     %rax                    # restore caller-save register

    mov     %rax, %rdx              # save the current number
    mov     %rbx, %rax              # next number is now current
    add     %rdx, %rbx              # get the new next number
    dec     %ecx                    # count down
    jnz     print                   # if not done counting, do some more

    pop     %rbx                    # restore rbx before returning
    ret
 format:
    .asciz  "%20ld\n"

为什么函数 print: 不在 main 字段中调用?

cpy: intel-64 操作系统:debian

【问题讨论】:

  • 嗯?如果你想调用printf(),C 标准库中的一个函数,那你为什么告诉编译器链接到那个库?
  • 这是很奇怪的现象,但是手册上写的。

标签: assembly x86-64 gnu-assembler


【解决方案1】:

为什么“格式”在 .text 字段中?

.text 在汇编中的意思是“代码段”

gcc -nostdlib 文件.s -o 程序 为什么我会收到错误消息? /universe/earth/asm/file.s:14: undefined reference to `_printf' collect2: ld returned 1 exit status

您没有链接 printf 所在的标准库(-nostdlib 选项):链接器找不到它

如何解决这个错误?

要么显式链接标准库 (stdlib),要么链接另一个提供 printf 实现的库,或者删除 -nostdlib 开关

为什么函数 print: 不在 main 字段中调用?

“print”只是一个标签:你可以调用它,跳转到它,或者只是让程序的控制流进入它,就像在这个例子中一样。 (我可以说 print 不是一个“功能”,因为它缺少适当的序言)。

我可以向您推荐一些组装介绍吗?

或者你可以在互联网上找到许多其他的

【讨论】:

  • 如何链接 C 标准库? gcc -g3 hello3.s -o hello 我得到 hello3.s:14: undefined reference to `_printf' collect2: ld returned 1 exit status
【解决方案2】:

为什么“格式”在 .text 字段中? 不清楚你在这里问什么,但我认为你在问两件事,压缩在这里:

mov     $format, %rdi           # set 1st parameter (format)

format:
    .asciz  "%20ld\n"

在您的.text 部分,您指的是format 标签。稍后,您定义format 标签。

为什么会出现错误? 您正在指定编译器选项 -nostdlib,它排除了通常包含的库,包括 printf 函数。

为什么函数 print: 不在 main 字段中调用? 没有 function 打印,但有一个标签,并且它 正在 被使用:

jnz     print                   # if not done counting, do some more

它似乎是基于 %ecx 的循环的终止点,从 0x90 计数到 0。

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多