이 하나를 시도 ..
내 코드를 지금까지 (난 그냥 내가 잘못하고 지금까지와 같은 두 가지의 제품을 찾는거야 알고 싶어, 코드의 비 효율성을 무시하십시오) . 귀하의 코드는 서로 다른 절차에서 다른 루프를 가지고 있기 때문에 등 ECX 다시 초기화하지 않고 분석 복잡
OPTION CASEMAP:NONE
INCLUDE Irvine32.inc
ExitProcess proto, dwExitCode:dword
.data
str1 BYTE "Enter a positive integer: ",0
str2 BYTE "The sum is: ",0
str3 BYTE "The product is: ",0
str4 BYTE "The power result is: ",0
num1 DWORD 0
num2 DWORD 0
sum DWORD 0
prod DWORD 0
pow DWORD 0
tmp DWORD 0
.code
main PROC
mov edx, OFFSET str1 ;// Input
call WriteString
call ReadInt
mov [num1], eax
mov edx, OFFSET str1
call WriteString
call ReadInt
mov [num2], eax
call doSum ;// Calculations
call doMul
call doPow
mov edx, OFFSET str2 ;// Output
call WriteString
mov eax, [sum]
call WriteInt
call Crlf
mov edx, OFFSET str3
call WriteString
mov eax, [prod]
call WriteInt
call Crlf
mov edx, OFFSET str4
call WriteString
mov eax, [pow]
call WriteInt
call Crlf
invoke ExitProcess, 0
main ENDP
doSum PROC ;// Sum
mov eax, [num1]
add eax, [num2]
mov [sum], eax
ret
doSum ENDP
doMul PROC ;// Multiply: Add num1 x num2 times
xor eax, eax
mov ecx, [num2]
ADD_LOOP:
add eax, [num1]
loop ADD_LOOP
mov [prod], eax
ret
doMul ENDP
doPow PROC ;// Power: Add num1 x num2 times and
mov eax, [num1] ;// add result x num2 times till ebx=0
mov [tmp], eax
mov ebx, [num2]
dec ebx
POW_LOOP:
xor eax, eax
mov ecx, [num1]
ADDPOW_LOOP:
add eax, [tmp]
loop ADDPOW_LOOP
mov [tmp], eax
dec ebx
jnz POW_LOOP
mov [pow], eax
ret
doPow ENDP
END main
곱셈과 전력 PROC에서 추가 시저의 호출로
수정 된 버전 :
이
OPTION CASEMAP:NONE
INCLUDE Irvine32.inc
ExitProcess proto, dwExitCode:dword
.data
str1 BYTE "Enter a positive integer: ",0
str2 BYTE "The sum is: ",0
str3 BYTE "The product is: ",0
str4 BYTE "The power result is: ",0
num1 DWORD 0
num2 DWORD 0
sum DWORD 0
prod DWORD 0
pow DWORD 0
tmp DWORD 0
.code
main PROC
mov edx, OFFSET str1 ;// Input
call WriteString
call ReadInt
mov [num1], eax
mov edx, OFFSET str1
call WriteString
call ReadInt
mov [num2], eax
mov eax, [num1] ;// Calculations
mov ebx, [num2]
mov ecx, 1
call doSum
mov [sum], eax
call doMul
call doPow
mov edx, OFFSET str2 ;// Output
call WriteString
mov eax, [sum]
call WriteInt
call Crlf
mov edx, OFFSET str3
call WriteString
mov eax, [prod]
call WriteInt
call Crlf
mov edx, OFFSET str4
call WriteString
mov eax, [pow]
call WriteInt
call Crlf
invoke ExitProcess, 0
main ENDP
doSum PROC ;// Sum: (add ebx to eax) * ecx times
SUM_LOOP: ;// when ecx = 1 => simple addition a+b
add eax, ebx
loop SUM_LOOP
ret
doSum ENDP
doMul PROC ;// Multiply: Add num1 x num2 times
xor eax, eax
mov ebx, [num1]
mov ecx, [num2]
call doSum ;// call Sum proc
mov [prod], eax
ret
doMul ENDP
doPow PROC ;// Power: Add num1 x num2 times and
mov eax, [num1] ;// add result x num2 times till end
mov [tmp], eax
mov esi, [num2]
dec esi
POW_LOOP:
xor eax, eax
mov ebx, [tmp]
mov ecx, [num1]
call doSum ;// Call Sum proc
mov [tmp], eax
dec esi
jnz POW_LOOP
mov [pow], eax
ret
doPow ENDP
END main
분명히 곱셈과 덧셈 (?)의 관계를 학교에서 배웠습니다. 위키 피 디아에서 인용하기 : _ "두 정수의 곱셈은 그 중 하나를 다른 숫자의 값만큼 여러 번 더하는 것과 같습니다 (예 : 3에 4를 곱한 것 (종종"3 곱하기 4 ")는 4의 3 개의 사본을 추가하여 계산할 수 있습니다"_. – Michael
곱셈이 단순히 x86에서 mul/imul 명령을 사용할 수 없다는 것이 제정신이 아닌 것처럼 보입니다. 어쨌든 [shift-add] (http://stackoverflow.com/questions/2776211/how-can-i)를 사용할 수 있습니다. 곱셈 및 나눗셈을 사용하는 비트 시프 팅 및 가산)은 그것을 에뮬레이션한다. –
이해하는데 많은 어려움이 있습니다. 작성한 각 코드 행에 (의미 있고 정확한) 주석을 달면 조명이 더 빨리 나타납니다. –