2013-10-01 3 views
1

Я хочу найти факториал числа, которое меньше 8, используя этот код. но это не работает, может ли кто-нибудь помочь мне? Это была моя домашняя работа. я пытался, но он печатает же символ и agian ..Факториал в языке ассемблера

.model small_ 
.stack_ 

.data_ 
no db 1h_ ; 
counter db 1_ 
string1 db "Please Enter the No. to calculate factorial (0~8): ","$" 
string2 db "Factorial is: ","$" 

.code 
main proc 
mov ax,@data 
mov ds,ax 
mov dx,offset string1 
mov ah,09h 
int 21h 
mov cl,1 
loop1: 
cmp counter,3 
ja End1 
mov ah,01h 
int 21h 
sub al,48 
inc counter 
mov no,al 
cmp no,8 
ja loop1 

Factorial: 
cmp no,cl 
je display 
mul al,cl 
inc cl 
jmp factorial 

Display: 
mov ax,@data 
mov ds,ax 
mov dx,offset string2 
mov ah,09 
int 21h 
mov dl,al 
add dl,48 
mov ah,02h 
int 21h 
End1: 
mov ah,4ch 
int 21h 
main endp 
**_End main _** 
+2

показать нам свои 8 строк кода –

+0

Кто сказал, что это было всего 8 строк? ;) – Bucket

+0

Прошу прощения, но мы не делаем [Whitespace] (http://en.wikipedia.org/wiki/Whitespace_ (programming_language)). – Renan

ответ

3

У вас есть по крайней мере три основные проблемы в вашем коде:

  • 8! является слишком большим, чтобы поместиться в AL.
  • Ваш код печати работает только для номеров до 9. Вы добавляете 48, а затем печатаете как символ, который отлично подходит для одноразрядных, но даже для 10 он не может работать. Вам нужно написать полный раздел для печати номеров (или, возможно, использовать тот, который предоставил ваш профессор)?
  • Вы сохраняете результат своих вычислений в AL, но вы перезаписываете его, когда вы делаете mov ax, @Data.
+0

Но он должен работать на 2 или 3. но его вообще не работает .. :( – Mujahid

+0

Charctr like Pi печатается каждый раз .. – Mujahid

+0

@Mujahid Это правда, он должен работать на 2 или 3. Вы уверены 'mul al, cl' является действительной сборкой 8086. Я думал, что' mul' взял один операнд, а 'al' был неявным, так что это должно быть просто' mul cl'? – us2012

0

попробовать это:

GetFactorial proc N:DWORD 
    mov eax,N 
    mov ebx,eax 
    @L: 
    dec ebx 
    Test ebx,ebx 
    je @End 
    imul eax,ebx 
    jmp @L 
    @End: 
    ret 
GetFactorial endp 
Смежные вопросы