2011-04-28 60 views
2

你如何獲得該C與SPARC彙編相當於:SPARC彙編參數中的printf格式說明符?

printf("Hello, my name is %s.\n", name); 

使用的函數原型:

void printName(const char* msg, const char* name) 

其中msg是 「你好,我的名字爲%s \ n」。

我知道我可以用.asciz在數據段中定義「你好,我的名字是%s。\ n」,而沒有第一個參數msg,但是有沒有辦法將一個字符串傳遞給一個彙編函數會有%s的標識符嗎? char *甚至可以採用格式標識符嗎?我試過以下,但我得到了一個核心轉儲。用C

函數調用:

char * msg = "Hello, my name is %s.\n"; 
char * name = "Foo"; 

printName(msg, name); 

大會:

mov %i0, %o0 
mov %i1, %o1 
call printf, 2 
nop 

也許我沒有正確地接近函數原型?

+0

我不明白的問題。該C代碼片段是否工作?如果是這樣,爲什麼不看一下編譯器生成的彙編器呢? – 2011-04-28 07:08:49

+0

奧利是對的,看着生成的彙編程序將是你最簡單的方法。我不知道sparc彙編程序,但是你可能會發現C函數的參數被傳遞到堆棧上,而不是作爲寄存器(這看起來就像你在做什麼)。如果你還沒有,我會開始嘗試獲得'printf(「hello world \ n」);'先工作,即沒有參數說明符,然後從那裏開始工作。 – forsvarir 2011-04-28 14:46:07

回答

2

我其實不安靜肯定你在做什麼錯的,但下面的程序工作,它應該:

 .data 
s0:  .asciz "foo %s\n" 
s1:  .asciz "bar" 
     .text 
     .global main 
main: 
     save %sp, -96, %sp 
     set  s0, %o0 
     set  s1, %o1 
     call prtnam 
     nop 
     ret 
     restore 
prtnam: 
     save %sp, -96, %sp 
     mov  %i0, %o0 
     call printf 
     mov  %i1, %o1 
     ret 
     restore 

關於參數的傳遞,論據這樣的少數寄存器傳遞。

1

printf,因爲它需要可變參數,所以在堆棧上,而不是在寄存器中取未命名的參數。也就是說,命名的'format'參數將在第一個參數寄存器中傳遞,但後續參數將傳遞到堆棧上。

看到在SPARC ABI,這裏的「代碼示例」部分章節「變量參數列表」:http://www.sparc.org/standards/psABI3rd.pdf

+0

你有一個死鏈接 – 2015-10-16 15:32:55