Печать числа в сборке NASM с помощью printf

Я пытался заставить это напечатать 12345 некоторое время. Кто-нибудь может подсказать, что мне делать? Он напечатает три строки текста, затем в четвертой строке напечатает «возраст», который, как я предполагаю, является остатком в стеке из строки 2.

    bits 64
    global main
    extern printf

    section .text
main:
    ; function setup
    push    rbp
    mov     rbp, rsp
    sub     rsp, 32
    ;
    lea     rdi, [rel message]
    mov     al, 0
    call    printf
;above code correctly prints message

;where the issue lies
push rbp
mov rbp, rsp
;sub rsp, 32

mov rax, 12345
;push rax   
mov al,0
call printf


    ; function return
    mov     eax, 0
    add     rsp, 32
    pop     rbp
    ret

    section .data
message: db      'Lab 3 - Modified Hello program',0x0D,0x0a,'COSC2425 - Pentium assembly language',0x0D,0x0a,'Processed with NASM and GNU gcc',0x0D,0x0a
count   dq  12345

person user3866044    schedule 30.06.2015    source источник


Ответы (1)


Очевидно, вы даже не знаете, как работает printf, что затрудняет вызов его из сборки.

Чтобы напечатать число, printf ожидает два аргумента, строку формата и число для печати, конечно. Пример: printf("%d\n", 12345).

Теперь, чтобы превратить это в сборку, вам, очевидно, нужно объявить эту строку формата, а затем передать оба аргумента, используя соответствующее соглашение.

Поскольку вы, похоже, используете sysv abi, это означает, что первые два аргумента входят в rdi и rsi соответственно. Кажется, вы уже знаете, что вам нужно обнулить al, чтобы указать, что регистры SSE не используются. Таким образом, соответствующая часть может выглядеть так:

lea rdi, [rel fmt]
mov rsi, 12345 ; or mov rsi, [count]
mov al, 0
call printf
...
fmt: db "%d", 0x0a, 0
person Jester    schedule 30.06.2015
comment
Этот класс станет моей смертью. В задании сказано загрузить rax с 12345. По электронной почте с просьбой о помощи, и он говорит, что это неправильно. Я пытался понять это в течение нескольких дней. Сейчас печатает 9012345. Есть идеи, почему? Это как-то связано с тем, как я отправляю строку в printf - person user3866044; 30.06.2015
comment
Как выглядит ваш код? То, что я показал в своем ответе, отлично работает. Вы должны передать число из rsi в printf, и никак иначе. Если вы настаиваете, вы можете сделать mov rax, 12345; mov rsi, rax, но это, конечно, глупо. - person Jester; 30.06.2015
comment
Мой код такой же, как и выше, но с вашей версией печати 12345. Это как-то связано с частью сообщения печати. Мне пришлось увеличить 12345 на 2 и переместить его обратно в регистр rsi (в задании он сказал rax) и использовать точно такой же бит кода для печати нового числа. печатается без 90. Это определенно что-то со строковой частью перед печатью числа. Я попробую разобраться! Благодарность! - person user3866044; 30.06.2015
comment
О, черт, надо было добавить это, извините! Хороший улов! Нужно добавить это в конец всех строк, включая формат (обновил ответ). Некоторые ассемблеры имеют специальные директивы, которые делают это автоматически. - person Jester; 30.06.2015