2017-03-05 69 views
0

假設有一個結構在結構中的偏移指針,以及如何組裝

struct info{ 
    struct stat information; 
    char * filename 
} 

然後我設置的偏移文件名指針

size_t fOffset = offsetof(struct info, filename); 

什麼現在是fOffset值?

而在SPARC程序集中,我想獲取文件名中的實際字符串。這是我迄今寫的。參數是信息結構的指針

set fOffset, %l0 
ld [%l0], %l1 

add %i0, %l1, %l2 
ld [%l2], %l2 

ldub [%l2], %o0 

我想現在%o0會存儲字符串,但顯然它沒有。誰來幫幫我?

+1

偏移量將取決於'struct stat'的定義以及要使用的編譯器的實現和/或配置。 – MikeCAT

+0

我不認爲這個問題涉及到struct stat,它是關於struct info中的char指針成員 – faker

+1

'fOffset'的值可能是'sizeof(struct stat)' - 可能加上一些填充,但可能不是。您無法在裝配中確定該尺寸;你必須知道正確的尺寸 - 或者使用C而不是裝配。 –

回答

0

您已經正確完成了fOffset聲明,因此它將在結構中包含文件名的偏移量。我也認爲你的程序集是正確的,但我不確定你的意思是「%o2會存儲字符串」。在代碼的末尾,%l2是一個指向字符串的指針,%o2將包含字符串的第一個字節。所以你的代碼看起來對我是正確的。

什麼可能會錯誤的一些想法:

  • 因爲文件名是一個指針,你需要把它初始化的東西,可能使用malloc。如果你不這樣做,那麼你可能會在ldub指令上出錯,因爲指針會無效
  • 我猜你正在使用32位用戶空間,但如果你正在運行一個64位的userland,所有的 「LD」 的指令需要 「LDX」

另外請注意,您可以簡化序列:

add %i0, %l1, %l2 
ld [%l2], %l2 

到只有一個指令:

ld [%i0+%l1], %l2