Итак, прочитав краткое руководство по архитектуре x64, я написал несколько ассемблеров.
https://software.intel.com/en-us/articles/introduction-to-x64-assembly
Функция ассемблера вызывается из C. В свою очередь, ассемблер вызывает функции C.
Я не уверен в том, как работает механика стека, поскольку мне кажется, что она несколько раз портит стек.
Следующий код демонстрирует:
PUBLIC Lbra_R_A ; Op 16 - Long Branch Always
Lbra_R_A PROC
sub rsp, 28h
push rbx ; must preserve rbx
; Calc destination branch address by Adding the two Bytes at [PC+1] (high byte) and [PC+2] (low byte) with PC+2 reg
; Get first byte high byte
movzx rcx, word ptr [pc_s]
mov rbx, rcx ; save pc_s into temp
inc bx ; inc temp pc_s
call MemRead8_s ; returns byte in ax (al)
push ax ; save high byte
; Get second byte low byte @ pc_s
mov rcx, rbx
inc bx ; inc temp pc_s
call MemRead8_s ; returns byte in ax (al) - this call destroys saved high byte???
; combine low and high bytes to make 16 bit 2 complements offset
pop dx ; get saved high byte - wrong value
mov ah, dl ; move the high byte to high position ; ax now contains 16 bit offset
add bx, ax ; bx now contains pc_s(+2) + offset
mov word ptr [pc_s], bx
pop rbx ; must restore rbx - wrong value???
add rsp, 28h
ret
Lbra_R_A ENDP
Я установил стекс sub rsp, 28h, но я не уверен, почему, и я понятия не имею, что мне разрешено делать в этой области 28h !!!Это для меня или это зарезервировано.Однако без этого мой код даже не запускается !!!
Далее я сохраняю регистр rbx, потому что он считается энергонезависимым.Однако в конце, когда я восстанавливаю rbx, это не то же самое, что я сохранил ???
Средний код Я сохраняю / нажимаю регистр топора перед вызовом функции C под названием MemRead8_s (предоставлена мной).Однако в тот момент, когда я вызываю эту функцию, значение ax, хранящееся в стеке, перезаписывается, поэтому, когда я пытаюсь восстановить его несколько инструкций позже, это неправильно !!!Значение rsp до и после этого вызова, кажется, одинаково, так что сделал вызов этой функции со стеком?
Может кто-нибудь пролить свет на то, что является правильным протоколом настройки стека, и, возможно, объяснить, почему мой стек сохраняетпортятся?