所以對于下面的問題:
假設 x、y 和 z 被宣告為四字并包含有符號值。撰寫計算以下運算式結果的匯編代碼,并將結果留在 EAX 暫存器中。
(x y) / (y / z)
必須使用 NASM x86-64 完成,我想確定這個邏輯指令是否對上述問題有意義。它說將結果留在 EAX 中,所以我認為一切都必須由 E 暫存器完成。如果有人可以仔細檢查,請告訴我,或者是否有需要修復/改進的地方。
還有一件事,它不需要是完整的代碼。我已經有了這段教學邏輯代碼之外的所有宣告和函式,所以假設我已經定義了它們。
mov ecx, [x]
mov edx, [y]
mov esi, [z]
;MATH
add ecx, edx ; (x y)
cdq ; 32 byte register
mov eax, edx
idiv esi ; (y/z)
mov edx, eax
mov eax, ecx ; (x y) into eax
cdq
idiv ecx ; (x y)/z
uj5u.com熱心網友回復:
用預期的效果評論每條指令將有助于:
mov ecx, [x] ; ecx = x
mov edx, [y] ; edx = y
mov esi, [z] ; esi = z
;MATH ; eax is undefined garbage!
add ecx, edx ; ecx = (x y)
cdq ; edx:eax = eax ; overwrites edx with 0 or -1
mov eax, edx ; eax = either 0 or -1
idiv esi ; eax = (garbage / z), edx = remainder of garbage
mov edx, eax ; edx = garbage
mov eax, ecx ; eax = (x y)
cdq ; edx:eax = (x y)
idiv ecx ; eax= (x y) / (x y) = 1, edx = remainder 0
如您所見,edx當需要除法時,使用for 保持值并不是一個好主意。指令idiv或div期望暫存器對中的被除數,edx:eax它們eax用結果(商)和edx余數覆寫。
cdq應該用于在每次除法之前將有符號值擴展eax為對edx:eax。
為y值選擇另一個暫存器。正如 Nate 所提到的,對于四字值,您將需要 64 位暫存器。而不是cdq您需要cdo將符號擴展rax到rdx:rax. 當最終結果適合 32 位時,您可以將其保留eax 原樣,但 64 位函式通常回傳rax。
uj5u.com熱心網友回復:
你能通過視覺表達來澄清嗎?我將宣告更改為ecxfrom edx,并修復了cdq。我仍然不確定如何轉換 R 暫存器并將結果放入 EAX
mov ebx,[x] ; ebx = x
mov ecx,[y] ; ecx = y
mov esi,[z] ; esi = z
add ebx,ecx ; ebx = (x y)
mov eax,ecx ; eax = y
cdq ; edx:eax = y
idiv esi ; eax = (y/z) ; edx = remainder
mov ecx,eax ; ecx = (y/z)
mov eax,ebx ; eax = (x y)
cdq ; edx:eax = (x y)
idiv ecx ; eax = (x y) / (y/z)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386054.html
