使用printf在装配NASM中打印数字

时间:2015-06-30 16:08:47

标签: assembly printf nasm x86-64 calling-convention

我一直试图让它打印12345一段时间了。任何人都可以提供一些关于我应该做什么的提示吗?它将打印三行文本,然后在第四行打印“age”,我猜测它是第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

1 个答案:

答案 0 :(得分:2)

显然你甚至不知道printf是如何工作的,因此很难从汇编中调用它。

要打印一个数字,printf("%d\n", 12345)需要两个参数,一个格式字符串和当然要打印的数字。示例:rdi

现在要把它变成汇编,你显然需要声明那个格式字符串,然后使用适当的约定传递两个参数。

由于您似乎正在使用sysv abi,​​这意味着前两个参数分别进入rsial。您似乎已经知道必须将lea rdi, [rel fmt] mov rsi, 12345 ; or mov rsi, [count] mov al, 0 call printf ... fmt: db "%d", 0x0a, 0 归零以指示未使用SSE寄存器。因此,相关部分可能如下所示:

function friend_contact() {

$healthcard = get_field('healthcard');
$facebook = get_field('facebook');
$phone = get_field('phone');
$fax   = get_field('fax');
$email = get_field('email');

$post_info = '';

if (isset($healthcard['url'])) {
    $img = get_stylesheet_directory_uri() . "/images/mail-icon.png";
    $post_info .= '<a class="healthcard" href="'.$healthcard['url'].'"><img src="'.$img.'" /> Download Contact</a>';
}

if (isset($facebook['url']) && isset($healthcard['url']) {
    $post_info .= ' | ';
}   

if (isset($facebook['url'])) {
$post_info .= '<a href="'.$facebook['url'].'"><i class="fa fa-facebook" style="color:blue"></i> Facebook</a>';
}


$post_info .= '<ul class="friend-contact">';
$post_info .= "<li>$email</li>";
$post_info .= "<li>p: $phone</li>";
$post_info .= "<li>f: $fax</li>";
$post_info .= "</ul>";

var_dump($facebook);    
var_dump(get_field('facebook'));

genesis_markup( array(
    'html5' => sprintf( '<div class="entry-meta">%s</div>', $post_info ),
    'xhtml' => sprintf( '<div class="post-info">%s</div>', $post_info ),
) );
}