我有一個程序,我可以這樣調用:尋址指針數組中ASM
mov rdi, struc_point
mov rsi, struc_color
call put_pixel
現在,我想創建類似指針數組有一個顏色表。我現在已經是這一點,它不工作:
color_table:
dq 0 ; null color
dq struc_color1
dq struc_color2
dq struc_color3
; etc..., the colors are defined somewhere else
現在,我願做這樣的事情與它到底:
mov rbx, 2 ; index into color table
mov rdi, struc_point
mov rsi, qword [color_table+8*rbx]
call put_pixel
到底哪裏出問題了?沒有編譯器錯誤,但是當我運行它時,所有動畫都會停止。 rsi
應包含地址struc_color
,請參閱第一個片段。如果我對這種顏色進行硬編碼(mov rsi, struc_color
),程序將起作用。
這是在x86_64 asm中,無需任何操作系統直接啓動。
當我運行這個,所有的動畫停止。沒有編譯器錯誤。 'rsi'應該包含struc顏色的基地址,請參閱第一個片段。如果我對顏色進行硬編碼(因此省略顏色表('mov rsi,sky_color')),程序就能正常工作 - 每個像素都以這種顏色正確顯示。所以這個問題似乎與「顏色表」有關。 – poetryofruins
而不是64位指針,爲什麼不直接在顏色表中存儲顏色?或者,如果您指向的定義是連續存儲的,則可以存儲8位或16位索引。順便說一下,'mov ebx,2'會保存一個指令字節(REX前綴),除非你的彙編程序在可能的時候已經離開它。 –
使用該表的片段與不包含的片段不同。一:它打破了'rbx'。你在這個函數中保存/恢復'rbx'嗎? (假設你正在使用一個調用約定,其中'rbx'是一個被調用者保存的寄存器。)「struc_color2」與「struc_color」相同嗎?你有沒有試過在bochs或其他x86模擬器/仿真器上運行你的自制系統,所以你可以從外面調試它?例如看看它卡在哪裏? –