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
حالا مشکل این است که در دور دوم حلقه یعنی وقتی که 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