我一直试图让它打印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
答案 0 :(得分:2)
显然你甚至不知道printf
是如何工作的,因此很难从汇编中调用它。
要打印一个数字,printf("%d\n", 12345)
需要两个参数,一个格式字符串和当然要打印的数字。示例:rdi
。
现在要把它变成汇编,你显然需要声明那个格式字符串,然后使用适当的约定传递两个参数。
由于您似乎正在使用sysv abi,这意味着前两个参数分别进入rsi
和al
。您似乎已经知道必须将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 ),
) );
}