2013-04-10 1 views
1

이미 프로그램의 절반을 코딩했습니다. 문제는 내가 수학 연산 부분을 코드화하는 법을 모른다는 것입니다. mn (m^n)의 힘으로 올리는 것입니다. 그래서 초보자로서 나에게 조언 해 줄 수 있니? 또한어셈블러 프로그램 (TASM)이 n을 (m^n)의 제곱 승으로 계산합니다.

.MODEL SMALL 

.DATA 

greet db 13,10, "Welcome to Simple Calculator: Raise m to the power n. $" 
msg1 db 13,10, 0AH,0DH,"Please enter integer (m:-99 to 99): $" 
m  db 3,4 dup(?) 
msg2 db 10,13, 0AH,0DH,"Please enter power (n:1 to 9): $" 
n  db 3,4 dup(?) 
total db 10,13, "Answer: $" 


.CODE 

START: 

mov ax, seg greet 
mov ds, ax 
mov dx, offset greet 
mov ah, 09h  ;Display message 
int 21h 

mov ax, seg msg1 
mov ds, ax 
mov dx, offset msg1 
mov ah, 09h 
int 21h   ;Print a message 

mov ah, 0ah 
mov dx, offset m 
int 21h   ;Get 'm' value 


n_POWER: 

mov ax, seg msg2 
mov ds, ax 
mov dx, offset msg2 
mov ah, 09h 
int 21h   ;Print a message 

mov ah, 0ah 
mov dx, offset n ;Get 'n' value 
int 21h 

mov ax, m 
mov n, ax 
mul ax, n 
mov total, n 

finish: 
mov ah, 09h ;Display message 
int 21h 

mov ax,4c00h ;Return control to DOS 
int 21h   
end start 

, 나는 사용자 (예. -99)에서 음의 입력을 얻을 수있는 방법?

+0

"JMP"명령을 사용해야합니까? – user2264387

답변

1

당신은 같이 곱셈을 반복 할 수 있습니다

5^13 = 5^(0b1101) = 1*(5^1)*(5^4)*(5^8) 

한 수 때문에 반복 평방 사본 베이스의 5 : 5 -> 25 -> 625 -> 390625를 곱하여 지수의 2 진 표현에 대응하는 비트 세트가있는 항을 곱하십시오.

이것은 16 비트 산술 연산에 과도 할 수 있지만 교수가 모듈 식 지수 연산을 대신 수행하도록 요청하면 편리합니다 (비대칭 암호화에서 사용됨).

두 가지 방법이 조건를 사용하여 필요로하는 점프 :

조건부 하나는 단순히 않는 작업의 cx 번호를 반복 :

  mov cx, 13 
label: nop // put your block of code here 
     nop 
     loop label; // The instruction at label will be executed 13 times 
     // and cx will end up being zero 

이 비트가 설정되고 테스트하려면, 하나는 할 수

  mov dx, 13  ;; let's have the exponent here 
label: test dx, 1  ;; check if the first bit is zero 
         ;; test performs bitwise _and_ between the operand 
         ;; and sets ZERO flag (among other things) 
     jz notset  
     nop    ;; insert here the statements to be executed 
         ;; when the bit in the exponent is set 
notset: shr dx, 1  ;; shift out the least significant bit -- this also 
         ;; sets the ZERO_FLAG if dx goes to zero 
         ;; (and it eventually does) 
     jne label;  ;; 

btw. JNE == 동일하지 않으면 점프 또한 제로 플래그를 테스트합니다. 점프가 아닌 경우 점프와 동의어입니다.

+0

네, 도와 줘서 고마워.하지만, 왜 내가 13 번 루핑을 사용해야합니까? '13'은 권력을 'n'으로 바꿀 수 있습니까? – user2264387

+1

예, 변수로 상수를 대체 할 수 있고해야합니다. 또한 곱셈 및 제곱을 수행하는 지침을 작성해야합니다. 이것은 학습 목적을 무효로 할 수 있기 때문에 복사 붙여 넣기의 완전한 블록이 결코 아닙니다. –

+0

예를 들어 입력을 넣으려는 경우. '-99', 어떻게해야합니까? 나는 바이너리로 그 것들을 변환해야합니까? 또는 다른 방법으로? – user2264387

0

정수 전력을 계산하는 것은 일련의 곱셈입니다. 예를 들어, 5^2 == 5 * 5, 2^3 == 2 * 2 * 2 등이 있습니다.

따라서, 단순 승산 루프 충분할 것이다 결과 (암시 마지막 반복을 제외하고)보다 큰 16 비트 성장 어디에 예 코드의 경우를 처리하지

mov bx,5 ; m 
mov cx,3 ; n 
mov ax,1 ; Initial result, i.e. m^0 
power: 
    jcxz power_done 
    mul bx 
    loop power 
power_done: 
; ax now contains m^n 

참고. m의 음수 값도 처리하지 않습니다. 필요한 경우 이러한 것들을 수정하는 방법에 대한 지침 집합 참조를 찾는 연습으로 남겨 두겠습니다. 이 이진 표현의 당신이/지수를 처리해야 할 수

int result = 1; while (exp-->0) { result *= base; } return result; 

또는 :

+0

왜 jcxz가 필요한가요? (일반적인 경우에 루프 블록 안에있는 이유는 무엇입니까?) –

+0

모든 입력을 처리하는 자체 포함 루프 블록을 만들려면 = 0을 사용해야합니다. 능력을 계산합니다 (이 경우 OP는 최신 C/C++ 컴파일러를 사용하여 하루 만 호출해야합니다). – Michael

+0

은 '5'를 'm'으로 대체 할 수 있다는 것을 의미합니까? – user2264387