PDA

View Full Version : مشکلی در تقسیم کلمه بر کلمه



HosseinProgrammer
شنبه 17 آذر 1386, 08:28 صبح
سلام. برنامه زیر یک عدد را از ورودی خوانده و به وسیله تابع Convert تبدیل به عدد و در Number ذخیره میکند. سپس تشخیص میدهد که این عدد اول است یا خیر. برای اینکار باقیمانده رو در تقسیم Number بر Bx که از دو شروع میشود و تا نصف Number ادامه پیدا میکند چک میکنم که صفر شده یا نه. اگر صفر شد (Flag=0) عدد اول نیست در غیر اینصورت اول است. ضمنا تقسیم کلمه بر کلمه است. پس باقیمانده باید در DX برود.
حالا مشکل این است که در دور دوم حلقه یعنی وقتی که BX=4 است، نتیجه تقسیم عددی مثل Number=AX=71 عجیبه. خارج قسمت که همان AX است، 21869 میشود و خارج قسمت یعنی DX ، صفر! 21869 = 4 / 71 !!!
ممنون میشم اگه راهنماییم کنید. این موضوع به شدت ذهنمو مشغول کرده!


.Stack 64
.Data

Number DW ?

Flag DB 1

B DW ?

Base DB 2

Sign DW ?

Count DB 0

MSG1 DB 0Dh,0Ah,"Aval Ast.",'$'
MSG2 DB 0Dh,0Ah,"Aval Nist.",'$'

Strlist Label Byte
Max DB 20
Len DB ?
Buffer DB 20 Dup(' ')

Enter DB 0Ah,0Dh,'$'

.Code
main proc far

mov ax, @data
mov ds, ax

Call Convert

mov ax, Number
div Base
and ax, 00FFh
mov B, ax ; B = Number/2
mov bx, 2
x:
cmp bx, B
ja End_Loop
mov ax, word ptr Number
div bx
cmp dx, 0
jne Next
mov flag, 0
Next:
inc bx
jmp x
End_Loop:

cmp Flag, 1
jne Print_No
lea dx, MSG1
jmp Next2
Print_No:
lea dx, MSG2
Next2:
mov ah, 09h
int 21h

mov ah, 4Ch
int 21h

main endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Convert proc near

mov ah, 0Ah
lea dx, Strlist
int 21h
lea bx, Buffer
; Hazfe Space-haye Ebtedaaye Reshte
L1:
cmp byte ptr[bx], ' '
jne L2
inc bx
jmp L1
L2:
mov sign, 1
cmp byte ptr [bx], '+'
je L3
cmp byte ptr [bx], '-'
jne L4
mov sign, -1
L3:
inc bx
L4:
mov ax, 0
L6:
cmp byte ptr [bx], '0'
jl L5
cmp byte ptr [bx], '9'
jg L5
mov cx, 10
mul cx
mov cl, [bx]
sub cl, 48
mov ch, 0
add ax, cx
inc Count
inc bx
jmp L6
L5:
mov cx, sign
mul cx
mov Number, ax

ret
Convert endp

end main

hoax3r
شنبه 17 آذر 1386, 09:52 صبح
خب شما قبل اینکه بخوای تقسیم کنی باید dx رو صفر کنی

HosseinProgrammer
شنبه 17 آذر 1386, 11:43 صبح
ممنون از جوابتون.

ولی یک سوال دیگه مونده و اون اینه که اگر من عدد ورودی رو بالا وارد کنم مثلا 32000 در جایی که عدد تقسیم بر دو شده و در B ذخیره میشه چنین errori میده. میخواستم ببینم مشکل چیه و اصلا چرا چنین خطایی روی میده. (چرا Ax=16000) نمیشه.

divide error - over flow

پیشاپیش از جوابتون ممنونم.

hoax3r
شنبه 17 آذر 1386, 12:46 عصر
ببینید برای تقسیم یه سری قانون هست که باید رعایت کنید به این صورت که

1- اگه مقسوم علیه ( Base ) برابر یک بایت باشد مقدارش باید بزرگتر از AH یعنی بایت سمت چپ مقسوم (AX) باشد

2- اگه مقسوم علیه برابر یک کلمه باشد مقدارش باید بزرگتر از DX یعنی کلمه سمت چپ مقسوم باشد

3- اگه مقسوم علیه برابر یک دوکلمه باشد مقدارش باید بزرگتر از EDX یعنی دوکله سمت چپ مقسوم باشد.

پس در نتیجه :
وقتی شما 32000 رو میدین که به صورت هگز میشه 7D00
طبق قانون اول base باید بزرگتر از ah باشه( 2 > 7D ) که اینطور نیست ودر نتیجه
اون ارورر رو میده
شما اگه base رو به صورت DW معرفی کنید حل میشه

شاد باشید