어셈블리에서 다음 작업에 문제가 있습니다. 어셈블리 IA32에서 작업 중입니다. -4 (% ebp) = x 및 -8 (% ebp) = y라고 가정하고 이미 사용자로부터 가져온 것입니다 (둘 다 32 비트 길이). 이 코드입니다 : 나는이 개 긴 숫자를 곱하고 64 바이트에 도달 할 경우에도 결과를 인쇄 할 수 있기를 원하기 때문에 곱셈의 결과가 %의 LLU에어셈블리 곱하기 작업 64 비트
format1: .string "Multiply : %u * %u = %llu\n"
format2: .string "Divide : %u/%u = %u\n"
# operation multiply
movl -4(%ebp), %eax
mull -8(%ebp)
pushl %edx
pushl %eax
pushl -8(%ebp)
pushl -4(%ebp)
pushl $format1
call printf
# operation divide
movl -4(%ebp), %eax
divl -8(%ebp)
pushl %eax
pushl -8(%ebp)
pushl -4(%ebp)
pushl $format2
call printf
이유입니다. 또한 % edx에서 mull 명령은 64 바이트 결과의 "다른 32 바이트"를 저장하므로 printf에도 스택으로 푸시해야합니다. 예 :
Multiply : 4000000000 * 2 = 16000000000
은 또한, I는 X.YZ 결과를 반환하기 위해 4 분할기 (3)의 조작을 할 :이 결과를 원한다. (가수가 2 개 이상이고 반올림하지 않음) 예 : 19 1000
Divide : 3/4 = 0.75
:
Divide : 19/1000 = 0.01
8과 2
: 정말 결과하지만 성공을 얻기 위해 많이 노력Divide : 8/2 = 4.00
. 감사합니다. :)
'4000000000 * 2 = 16000000000'? 스타 워즈 : 펜티엄이 역습? –
예를 들면, 최대 64 비트의 결과를 얻을 수 있어야합니다. 그리고이 예제가 내 코드에서 아직 작동하지 않습니다./ – Jjang
왜? 왜이 C 또는 C++ 태그를 사용 했습니까? C를 고집한다면 C 전문가, 즉 C 컴파일러에게 어떻게 그런 일을 할 것인지 물어 보았습니까? (예 : gcc 또는 clang을 사용하면 -S가 꽤 좋은 어셈블리 코드를 생성합니다.) –