1

我编译了一个代码。

.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

4

2 回答 2

2

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

.text 汇编中的意思是“代码部分”

gcc -nostdlib file.s -o program 为什么会报错?/universe/earth/asm/file.s:14:未定义对“_printf”的引用 collect2:ld 返回 1 退出状态

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

如何解决此错误?

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

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

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

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

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

于 2013-04-15T10:18:21.697 回答
1

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

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

format:
    .asciz  "%20ld\n"

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

为什么我会收到错误消息? 您正在指定-nostdlib排除通常包含的库的编译器选项,包括printf函数。

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

jnz     print                   # if not done counting, do some more

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

于 2013-04-15T10:22:08.373 回答