PDA

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



xman_1365_x
یک شنبه 29 آبان 1390, 16:50 عصر
با سلام و احترام خدمت همه دوستان

دو برنامه کارشون مشخص هست دو رشته عددی با طول مشخص که تعیین میکنید رو با هم جمع میکند ،اگر دوستان سوال یا مشکلی در این ارتباط داشتن در خدمتم(لطفا خواندن امضا فراموش نشه)

جمع دو رشته عددی دسیمال



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.


جمع دو رشته عددی باینری




.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
دوشنبه 30 آبان 1390, 00: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, 01:53 صبح
سورس دو عدد باینری و کاراکتری به روش ساده تر
شما خودتون سورس رو امتحان کردین ؟ فکر میکنید خروجی درسته ؟ اول یکبار خروجی بگیرین بعد سورس به اشتراک بزارین!

hojatmohammadi
دوشنبه 30 آبان 1390, 21:12 عصر
جواب درسته چون دو تا عدد 10 رقمی رو پشت سر هم میگیره و جواب رو رویه عدد اولی ذخیره میکنه و عدد دوم هم سر جایش هست ! واسه همین احساس میکنید که اشتباه هست جواب !

xman_1365_x
سه شنبه 01 آذر 1390, 00:04 صبح
جواب درسته چون دو تا عدد 10 رقمی رو پشت سر هم میگیره و جواب رو رویه عدد اولی ذخیره میکنه و عدد دوم هم سر جایش هست ! واسه همین احساس میکنید که اشتباه هست جواب !

بله درسته الان حافظه رو چک کردم حاصل درسته البته اگر هر دو عدد کوچک باشن و از بازه تجاوز نکنه چون همون یک بیت رو درنظر نگرفتین ، ورودی گرفتن و خروجی دادنتوم طوری بود تا دیدم گفتن اشتباه هست دیگه چک نکردمش (کسی نمیتونه وقت بزاره خط به خط برنامه هارو بررسی کنه چی نوشته شده!)
هنگامی که ورودی میگیرین به خط بعد برین و ورودی بعدی رو بگیرین یا فاصله ای قرار بدین که اینطور نامنظم نباشه
---
حالا سوال : این روش چه مزیتی نسبت به روشی که من نوشتم داره ؟
کد که طولانی تر شده ، مقایسه دو برابر شده

حالا یک مزیت برای دوستان علاقه مند!
کسی که هر دو روش رو ببینه میتونه میکس کنه و کد رو به نصف کاهش بده
یعنی اگر کد من با کری بررسی بشه دیگه مقدار دهی آرایه 3 از بین میره و کد نهایی کاهش پیدا میکنه
بازم ممنون که یادآوری کردین،باعث شد تا دوباره بررسی کنم و بگم مشکل کار کجا بوده، البته بهتر بود شما سورس رو قرار دادین کمی در ارتباط با برنامه توضیح میدادین
موفق باشی

hojatmohammadi
سه شنبه 01 آذر 1390, 08:47 صبح
بله درسته الان حافظه رو چک کردم حاصل درسته البته اگر هر دو عدد کوچک باشن و از بازه تجاوز نکنه چون همون یک بیت رو درنظر نگرفتین ، ورودی گرفتن و خروجی دادنتوم طوری بود تا دیدم گفتن اشتباه هست دیگه چک نکردمش (کسی نمیتونه وقت بزاره خط به خط برنامه هارو بررسی کنه چی نوشته شده!)
هنگامی که ورودی میگیرین به خط بعد برین و ورودی بعدی رو بگیرین یا فاصله ای قرار بدین که اینطور نامنظم نباشه
---
حالا سوال : این روش چه مزیتی نسبت به روشی که من نوشتم داره ؟
کد که طولانی تر شده ، مقایسه دو برابر شده

حالا یک مزیت برای دوستان علاقه مند!
کسی که هر دو روش رو ببینه میتونه میکس کنه و کد رو به نصف کاهش بده
یعنی اگر کد من با کری بررسی بشه دیگه مقدار دهی آرایه 3 از بین میره و کد نهایی کاهش پیدا میکنه
بازم ممنون که یادآوری کردین،باعث شد تا دوباره بررسی کنم و بگم مشکل کار کجا بوده، البته بهتر بود شما سورس رو قرار دادین کمی در ارتباط با برنامه توضیح میدادین
موفق باشی
درسته کد زیاد شده ولی مزیتش نسبت به برنامه کامل شما اینه که از کدهایه ساده تر استفاده شده !