2014-10-09 2 views
0

Работает следующий код. Однако он не работает, если я удаляю строку # 1. Я не понимаю, почему хранение $ 0 в% rax заставляет его работать.Вызов printf в x86

.section .data 
msg: .ascii "Hello world!\n" 

.text 
.globl main: 

main: 
movq $msg, %rdi 
movq $0, %rax  #1 
call printf 

Следующий код ошибки SEG

.section .data 
msg: .ascii "Hello world!\n" 

.text 
.globl main: 

main: 
movq $msg, %rdi 
call printf 

я прочитал, что, чтобы сделать вызов SYS целое значение, что обозначает вызов требуется в% бараков. Я сделал это с помощью write(), и он работал красиво. Тем не менее, примеры, которые я нахожу для printf, похоже, не имеют этого требования.

Любая помощь с этим вопросом оценивается. Я могу объяснить больше, если необходимо

ответ

2

Значение в rax должно быть числом передаваемых параметров точки плавания с использованием функции, поддерживающей переменное количество аргументов.

Этот document должен помочь, см. Раздел 3.5.7 в списках переменных аргументов.

Когда функция принимает аргументы переменной называется,% Rax должен быть установлен на общее число параметров с плавающей запятой, переданных функции в векторе регистров

Смежные вопросы