2014-02-19 3 views
0

저는 어셈블러가 어떻게 이것을 처리하는지 이해하려고합니다.어셈블러는 2 개의 레지스터 (예 : EDX : EAX)에서 분리 된 값을 어떻게 처리합니까?

현재 어셈블리 코드를 수동으로 작성하여 코드를 작성하는 방법을 배우려고합니다. 하지만 나는 EDX로 분리 된 제품을 다루는 방법을 궁금해합니다 : EAX 피연산자 "MUL"다음에.

정수 값을 다른 값으로 나누려면 어떻게해야합니까? 어셈블리에서 어떻게할까요?

+3

어셈블러는 인간 판독 명령을 기계어 코드로 변환하지만 아무 것도 "처리하지"않습니다. 그게 명령을 처리하는 CPU 야. –

답변

3

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 
+0

DIV가 EDX : EAX를 입력으로 사용한다는 것을 몰랐다. 그것이 gdb에서 어셈블리 코드를 추적하려고 할 때 혼란스러워하는 곳입니다. DIV가 입력 나누기로 나누어 진 EAX를 사용한다고 생각했습니다. 감사! – MDuh

0

일반적으로 더블 워드 곱셈이 있습니다. 8 바이트 결과가 EDX : EAX에 저장되고 결과의 상위 32 비트가 EDX에 저장됩니다.

1

구조를 사용하여 제품을 저장할 수 있습니다. 여기에서는 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 레지스터 쌍 :

enter image description here