저는 어셈블러가 어떻게 이것을 처리하는지 이해하려고합니다.어셈블러는 2 개의 레지스터 (예 : EDX : EAX)에서 분리 된 값을 어떻게 처리합니까?
현재 어셈블리 코드를 수동으로 작성하여 코드를 작성하는 방법을 배우려고합니다. 하지만 나는 EDX로 분리 된 제품을 다루는 방법을 궁금해합니다 : EAX 피연산자 "MUL"다음에.
정수 값을 다른 값으로 나누려면 어떻게해야합니까? 어셈블리에서 어떻게할까요?
저는 어셈블러가 어떻게 이것을 처리하는지 이해하려고합니다.어셈블러는 2 개의 레지스터 (예 : EDX : EAX)에서 분리 된 값을 어떻게 처리합니까?
현재 어셈블리 코드를 수동으로 작성하여 코드를 작성하는 방법을 배우려고합니다. 하지만 나는 EDX로 분리 된 제품을 다루는 방법을 궁금해합니다 : EAX 피연산자 "MUL"다음에.
정수 값을 다른 값으로 나누려면 어떻게해야합니까? 어셈블리에서 어떻게할까요?
MUL과 DIV는 모두 EDX를 사용하도록 설계되었습니다.
여기서 MUL은 출력 레지스터로 사용하며, DIV는이를 입력 레지스터로 사용합니다. 문제에 따라 DIV가 실제로 나머지 부분을 계산하여 edx에 배치하므로 다른 레지스터를 무시할 필요는 없습니다.
12313133*81231313/4342434 -->
mov eax, 12313133
mov ebx, 81231313
imul ebx
mov ebx, 4342434 ;; edx:eax = 38DAF:FE9E9FBD
idiv ebx
mov [my_result], eax ;; = 230334407
mov [remainder], edx
DIV가 EDX : EAX를 입력으로 사용한다는 것을 몰랐다. 그것이 gdb에서 어셈블리 코드를 추적하려고 할 때 혼란스러워하는 곳입니다. DIV가 입력 나누기로 나누어 진 EAX를 사용한다고 생각했습니다. 감사! – MDuh
일반적으로 더블 워드 곱셈이 있습니다. 8 바이트 결과가 EDX : EAX에 저장되고 결과의 상위 32 비트가 EDX에 저장됩니다.
구조를 사용하여 제품을 저장할 수 있습니다. 여기에서는 32 비트 코드를 사용하고 1073741824에 25를 곱합니다. 결과는 32 비트 레지스터 이상일 수 있으므로 edx : eax로 갈 것입니다.
예를 들어 MASM 코드입니다.
include masm32rt.inc
sProduct struct
LoDWord DD ?
HiDWord DD ?
sProduct ends
.data
fmtint db "%lld", 13, 10, 0
.data?
Product sProduct <?>
.code
start:
mov eax, 1073741824
mov ecx, 25
mul ecx
mov Product.HiDWord, edx
mov Product.LoDWord, eax
invoke crt_printf, offset fmtint, Product
inkey
invoke ExitProcess, 0
end start
그리고 calc로 테스트하여 결과가 올바른지 확인하십시오. 암시 적 - EAX 레지스터 쌍 :
어셈블러는 인간 판독 명령을 기계어 코드로 변환하지만 아무 것도 "처리하지"않습니다. 그게 명령을 처리하는 CPU 야. –