PDA

View Full Version : سوال: برنامه ای که دو عدد 20 رقمی را با هم جمع کند (2 عدد کاراکتر هستند)



hojatmohammadi
دوشنبه 23 آبان 1390, 22:59 عصر
ممنون میشم کسی جوابم رو بده ...............

xman_1365_x
سه شنبه 24 آبان 1390, 09:47 صبح
یزنامه ساده ای هست
الگوریتمش اینه
1-دو آرایه رو به عدد تبدیل کنید با کم کردن هر عنصر با 30 هگز
2-از سمت راست آرایه(انتها) خونه های آرایه ها رو عنصر به عنصر نظیر به نظیر با هم جمع کنید اگر حاصل کوچکتر از 10 شده حاصل رو در اندیس مشابه حاصل بریزین (آرایه با طول یک واحد بیشتر بریزین در جمع بد بینانه ترین حالت یک بیت بیشتر نیاز داریم برای حاصل)اگر حاصل بزگتر از 10 شده حاصل رو از 10 کم کنید حاصل رو در عنصر متناظر بریزین و عنصر بعدی حاصل را با یک جمع کنید.(دقیقا روش جمع کردن روی کاغذ)
3-حاصل رو تبدیل به کاراکتر کنید یا جمع کردن با 30 هگز
4- حاصل رو نمایش بدین با پیمایش یکی یکی عناصر

موفق باشی

hojatmohammadi
چهارشنبه 25 آبان 1390, 13:35 عصر
دوست عزیز ممنون میشم یه شبه کد واسه راهنمایی بذارین !



با سپاس فراوان از شما !

xman_1365_x
چهارشنبه 25 آبان 1390, 15:38 عصر
الان حالم اصلا خوب نیست حوصله توضیح و شبه کد هم ندارم برنامشو همون روز نوشتم استثنائا قرار میدم که میتونین با تغییر دادن عدد ها و equ تعداد ارقام رو مشخص کنید از 1 تا n رقم الان همون 20 رقم که شما خواستین ست شده
خواهشا سعی کنید برنامه رو بفهمید نه اینکه کپی کنید برید بدی استاد
و سعی کنید اگر جایی رو میتونید بهتر بنویسید انجامش بدین ، مثلا پروسیجر های مختلف بنویسید که عدد رو بگیره بعد نمایش بده و کاربر پسند شه دستورات من رو بهینه کنید و...


; multi-segment executable file template.

data segment
; add your data here!
pkey db 13,10,"press any key...$"
x db "75000000000000000000"
y db "25536000000000000000"
sum db 5 dup(0)
MAX EQU 19
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

; add your code here

;convert char to int
mov cx,MAX + 1
mov bx,MAX
x1:
sub x[bx],30h
sub y[bx],30h
dec bx
loop x1


;sum char(number) array
xor si,si
mov si, MAX
mov cx,MAX
add_loop:
mov al,x[si]
mov ah,y[si]

add al,ah
cmp al,10
jae carry

add sum[si+1],al
jmp endcarray
carry:
sub al,10
add sum[si+1],al
add sum[si-1],1
endcarray:
dec si
loop add_loop



;convert int to char & display output
xor bx,bx
mov ah,2
x2:
add sum[bx],30h
mov dl,sum[bx]
int 21h
inc bx
cmp bx,MAX + 2
je endx2
jmp x2
endx2:

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.



حتما برای دوستم دعا کنید...
موفق باشی

hojatmohammadi
چهارشنبه 25 آبان 1390, 22:19 عصر
اگه این دو عدد باینری باشن باید چی کار کنیم ..............

xman_1365_x
پنج شنبه 26 آبان 1390, 12:29 عصر
برای هر مبنایی که میخواد باشه فرقی نمیکنه شما باید ببینی کی کرسی رخ میده کنترلش کنی روش برای همه مبنا ها همینه
مثلا جمع دودویی
1+1=10
1+0=1
0+1=1
0+0=0
خوب در حالت اول کری داریم یعنی باید بیت 0 رو با حاصل متناظر حمع کنید و کری رو هم به بیت بعدی حاصل جمع کنید و باید حاصل رو هم در محاسبه بررسی کنید اگر کری رخ بده بیت بعدی حاصل یک شده
مثال
مرحله اول
11
11+
__
10
مرحله دوم بیت حاصل یک شده پس باید اونم جمع کنیم
1+1+1=11
11
11+
___
110
نکته ای که اینجا داریم و در سورسی هم گذاشتم در حالت جمع یک بیت بیشتر برای محاسبه درست نیاز داریم .

hojatmohammadi
جمعه 27 آبان 1390, 15:47 عصر
سلام مجدد !!
تا یه جاا هایی تونستم برسونم برنامه رو فقط یه جا مشکل داره...زمانی که این دو عدد را جمع میکنیم باید حاصل زیر رو بده
0 1 1 1 0 1
+
1 1 1 0 1 0
------------------------------------------------------------------
1000101
اما این حاصل رو میده
112101
یعنی نمیتونه بیت کری رو واسه 3 بنویسه و انتقال بده
----------------------------------------------------------------
این هم سورس برنامه :

; multi-segment executable file template.

data segment
; add your data here!
pkey db 13,10,"press any key...$"
x db "00000000000000101110"
y db "00000000000000010111"
sum db 5 dup(0)
MAX EQU 19
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

; add your code here

;convert char to int
mov cx,MAX + 1
mov bx,MAX
x1:
sub x[bx],30h
sub y[bx],30h
dec bx
loop x1


;sum char(number) array
xor si,si
mov si, MAX
mov cx,MAX
add_loop:
mov al,x[si]
mov ah,y[si]

add al,ah
cmp al,2
jae carry

add sum[si+1],al
jmp endcarray
carry:
sub al,2
add sum[si+0],al
add sum[si-0],1
endcarray:
dec si
loop add_loop



;convert int to char & display output
xor bx,bx
mov ah,2
x2:
add sum[bx],30h
mov dl,sum[bx]
int 21h
inc bx
cmp bx,MAX + 2
je endx2
jmp x2
endx2:

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.

xman_1365_x
شنبه 28 آبان 1390, 20:29 عصر
چون توجه نمیکنید که توی باینری کری رو هم در نظر بگیرید و من کری رو در همون حاصل میریزم و بعد چکش میکنم سورس رو از اول نگاه کنید هنوز جای بهتر نوشتن هست اما از حال من خارج

وقتی سه رفم باینری با هم جمع میکنید یعنی دو به توان 3 حالت وجود داره که در دوحالت برای ما مهم هست که حاصل 2 یا 3 میشه که ما هم بررسی میکنیم،کد رو دیباگ کنید سوالی بود بفرمایید.




; multi-segment executable file template.

.data
; add your data here!
MAX EQU 19
pkey db 13,10,"press any key...$"
x db "00000000000000101110"
y db "00000000000000010111"
sum db MAX+2 dup(0)


.stack dw 128 dup(0)


.code
start:
; set segment registers:
.startup

; add your code here

;convert char to int
mov cx,MAX + 1
mov bx,MAX
x1:
sub x[bx],30h
sub y[bx],30h
dec bx
loop x1


;sum char(number) array
xor si,si
mov si, MAX
mov cx,MAX
add_loop:
mov al,x[si]
mov ah,y[si]
mov bl,sum[si+1]

add al,ah
add al,bl
cmp al,2
je carry2
cmp al,3
je carry3

mov sum[si+1],al
jmp endcarray
carry2:
mov sum[si+1],0
mov sum[si],1
jmp endcarray
carry3:
mov sum[si+1],1
mov sum[si],1
endcarray:
dec si
loop add_loop





;convert int to char & display output
xor bx,bx
mov ah,2
x2:
add sum[bx],30h
mov dl,sum[bx]
int 21h
inc bx
cmp bx,MAX + 2
je endx2
jmp x2
endx2:

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h


end start ; set entry point and stop the assemble

موفق باشی

hojatmohammadi
یک شنبه 29 آبان 1390, 23:54 عصر
سورس برنامه به زبان ساده تر :::


; You may customize this and other start-up templates;
; The location of this template is c:\emu8086\inc\0_com_template.txt

org 100h
carry db 0
po db 0
mov cx,10
mov di,0
;----------------------------halghe
a:
mov ah,01
int 21h
mov d[di],al
add di,1

loop a




mov di,0
mov cx,10
b:
mov ah,01
int 21h
mov w[di],al
add di,1
loop b
mov po,al
mov ah,01
int 21h

;------------------------------------------------khandan tamam shod
mov di,9
mov cx,10
; mov carry,0
f:
mov al,d[di]
sub al,48
mov bl,w[di]
sub bl,48

add al,bl
add al,carry
;-------------------



cmp al,0
jne e1
mov carry,0
mov l[di],'0'
e1:

; ---------
cmp al,1
jne e2
mov carry,0
mov l[di],'1'
e2:
; ---------
cmp al,2
jne e3
mov carry,1
mov l[di],'0'
e3:

;---------
cmp al,3
jne e4
mov carry,1
mov l[di],'1'
e4:

dec di

loop f
;------------
mov cx,10
mov di,0

fh:

mov dl,l[di]
mov ah,02
int 21h
add di,1
; inc di
loop fh

ret
d db '?','?','?','?','?','?','?','?','?','?'

w db '?','?','?','?','?','?','?','?','?','?'

l db '?','?','?','?','?','?','?','?','?','?'

xman_1365_x
دوشنبه 30 آبان 1390, 00:55 صبح
سورس برنامه به زبان ساده تر :::
http://barnamenevis.org/showthread.php?314332-%D8%B3%D9%88%D8%B1%D8%B3-%D8%AC%D9%85%D8%B9-%D8%A8%D8%A7%DB%8C%D9%86%D8%B1%DB%8C-%D9%88-%D8%AF%D8%B3%DB%8C%D9%85%D8%A7%D9%84-%D8%AF%D9%88-%D8%B9%D8%AF%D8%AF-N-%D8%B1%D9%82%D9%85%DB%8C-(2-%D8%B9%D8%AF%D8%AF-%D8%B1%D8%B4%D8%AA%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B2-%DA%A9%D8%A7%D8%B1%D8%A7%DA%A9%D8%AA%D8%B1-%D9%87%D8%B3%D8%AA%D9%86%D8%AF)&p=1380305&viewfull=1#post1380305