2009-10-29 32 views
0

如果不使用全部四個通用寄存器,是否真的沒有辦法在程序集中將ascii字符串打印到標準輸出?Linux程序集的困境

+0

我們說的是intel嗎? – Tom 2009-10-29 03:00:41

+0

我們正在和&t ... – KJP 2009-10-29 03:05:39

+0

把英特爾或AT&T的語法放在一邊(這沒什麼區別),湯姆問你是否在談論Intel x86彙編。 – ephemient 2009-10-29 04:11:24

回答

6

權,它需要的參數三個寄存器加上一個系統調用號...

但是,86有pushapopa,這將推動和彈出所有的寄存器在一個指令。

$ cat hwa.S 
write = 0x04 
exit = 0xfc 
.text 
_start: 
     pusha 
     movl $1, %ebx 
     lea  str, %ecx 
     movl $len, %edx 
     movl $write, %eax 
     int  $0x80 
     popa 
     xorl %ebx, %ebx 
     movl $exit, %eax 
     int  $0x80 
.data 
str: .ascii "Hello, world!\n" 
len = . -str 
.globl _start 
$ as -o hwa.o hwa.S 
$ ld hwa.o 
$ ./a.out 
Hello, world! 
+1

什麼?這需要10個時鐘週期的普沙和波帕。八個獨立的推動和流行每個都需要一個。如果你打算在裝配時沮喪和骯髒,你必須保持信念並以最快的速度運行:-) – paxdiablo 2009-10-29 04:45:24

+0

在任何情況下,你都可以創建自己的系統調用,使用eax代碼和ebx用於以空字符結尾的字符串的地址。 Voila(儘管你需要說服Linus等人把它變成主流內核) - 讓我知道那是怎麼回事:-) – paxdiablo 2009-10-29 04:49:32

+0

+1,這是一個很好的答案。 – paxdiablo 2009-10-29 04:50:11

1

嗯..如果您對libc中你可以打電話puts鏈接,那麼你就會有一些被調用者保存寄存器... :-)

但是,是的。系統調用接口是通過寄存器傳遞的。抱歉。

不要這麼震驚。如果你正在對某些調用約定進行函數調用,它也是一樣。對於許多非常標準的平臺。 (包括我所知道的所有amd64編譯器...)

1

您可以編寫一個從堆棧中獲取所需參數的函數。

+0

你能舉個例子嗎? – KJP 2009-10-29 02:57:08