مرحبا انا طالبه علم حاسوب سنة تانيه اخدنا اسمبلي ومش عارفه عنها شي
يارت تساعدوني بهاد السوال والكم جزيل الشكر
السوال:-ادخل الارقم في bcd وحوله الى binary في لغه الاسمبلي؟؟
لو بسعدوني بتعملو في اكبر معروف
تحياتي لجميع
مرحبا انا طالبه علم حاسوب سنة تانيه اخدنا اسمبلي ومش عارفه عنها شي
يارت تساعدوني بهاد السوال والكم جزيل الشكر
السوال:-ادخل الارقم في bcd وحوله الى binary في لغه الاسمبلي؟؟
لو بسعدوني بتعملو في اكبر معروف
تحياتي لجميع
محاولاتك في الموضوع، لا أراها.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
#make_COM# ; COM file is loaded at CS:0100h ORG 100h .model small .stack 100h .data msg db 'enter the number ',0 num db ? .code main proc mov ax,0 mov ax,@data mov ds,ax lea dx,msg mov ah,09 int 21h mov ah,01h int 21h main endp end main
هون انا مدخله الرقم في الهكسه لازم احوله bcd وبعدين احوله الباينري
بس مش عارفه الكود المزبوط او الامور الي بحتاجه عارفه الاومر بس مش عارفه اوجه او استخدمها في البرنامج
شكرا الكم
تحياتي لجميع
تم تعديل هذه المشاركة بواسطة Xacker في 8 ديسمبر 2009 في 17:48
mov eax,0
هذا السطر غير ضروري.
ومن ثم هذه الشفرة لا تقوم بشئ، يمكن نقلها من صفحة كتاب أو مقال أو أي رد ووضعها هنا.. لا تعد محاولة إطلاقاً.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
للعلم بس هادي محولتي انا مو جيبتها من كتاب لو بدي اجيب من كتاب كان جبت الموضوع جاهز
وانا بعرف انه الامر AAA انو بحول اي رقم الي النطام الثنائي
بس المشكله الي بتوجهني اني مش عارفه احول من هكسه الى BCD
تم تعديل هذه المشاركة بواسطة سوزان الحنبلي في 5 ديسمبر 2009 في 18:53
سوزان الحنبلي كتب:وانا بعرف انه الامر AAA انو بحول اي رقم الي النطام الثنائي
ممكن مثال؟
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
انا هون مشكلتي اني مش عارفه استخدمها
يارت تعطيني مثال انت او تشرحلي عنها
وكيف ممكن استخدامها يعني بمكاني استخدمها مع ارقام مباشرة ولا لازم استخدم رجستر او احطها في موقع على الذكره
وبكون ممنونه لو جاوبتني اوشرحتلي عنها
أفكر بالتالي لتنفيذ العملية،
استلام الأرقام من المستخدم كـ string لذلك ستحفظ في الذاكرة بصيغة ASCII.
سأفترض أن الرقم المدخل هو 14 كـ string، بالتالي سيكون بالشكل: 31h 34h
سأنقص من السلسلة 30h فيصبح لدي 01h 04h
أقوم بتحميل كل قيمة إلى مسجل في الذاكرة، AL مثلاً
وباعتبار أن الأرقام ستكون ضمن المجال [0-9] سأقوم بتشكيل جدول تقابل لهذه الأرقام بالشكل التالي
تم تعديل هذه المشاركة بواسطة Xacker في 10 ديسمبر 2009 في 16:31
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
assume cs:cseg,ds:dseg,ss:sseg cseg segment start: mov ax,dseg mov ds,ax ;- mov dx,offset msg mov ah,09h int 21h ;- mov dx,offset buff mov ah,0Ah ; buffered input (check: http://www.ctyme.com/intr/rb-2563.htm) int 21h ;- mov dx,offset CRLF mov ah,09h int 21h ;- ; now [buff+1] = number length *i.e (1234) = 4* ; and [buff+2] = offset of actual number mov si,offset buff ; si = [buff] add si,2 ; si = [buff+2] mov bl,5 @@: cmp byte ptr [si],0Dh je @F sub [si],30h xor ax,ax mov al,[si] mul bl mov dx,offset bin add dx,ax mov ah,09h int 21h inc si jmp @B @@: ;- mov ax, 4C00h int 21h cseg ends dseg segment byte msg db 'enter a number: ','$' CRLF db 0Dh,0Ah,'$' buff db 6,7 dup (0) ; offset size desc ; ------ ---- ---- ; 00h byte max char buffer *can hold* in other words capacity (including CarriageReturn) ; 01h byte actual (n) chars read (excluding CarriageReturn) ; 02h n Bytes actual chars read (including CarriageReturn) ; -------------------------- ; so here I have: ; 6,x,nnnnnn ; ; ^---- max capacity w/ CR (5 digits + CR) ; ^---- actual (n) chars read w/o CR ; ^^^^^^---- actual chars read w/ CR ; ^^^^^^^^ ; 7 bytes filled with zeros *db 7 dup (0)* (offset 01h byte + 5 digits + CR) bin db '0000','$' ; 0 db '0001','$' ; 1 db '0010','$' ; 2 db '0011','$' ; 3 db '0100','$' ; 4 db '0101','$' ; 5 db '0110','$' ; 6 db '0111','$' ; 7 db '1000','$' ; 8 db '1001','$' ; 9 dseg ends sseg segment stack db 100h dup (?) sseg ends end start
* لا يتحقق في حال ورد "رمز" داخل سلسلة الأرقام المدخلة وبالتالي أنا غير مسؤول عمّا يظهر على الشاشة :P
* تم اختباره على Win XP
تم تعديل هذه المشاركة بواسطة Xacker في 11 ديسمبر 2009 في 16:35
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
X أنا بظن إن المطلوب التحويل الفعلي بين الـ BCD والـ Binary
يعني الرقم (13479) لازم يصير (11010010100111)
الخوارزمية بسيطة ... بس بدنا مين يحولها عالأسمبلي ! :D
int result, m = 1;
String s = "14379";
for(int i = 0 ; i < s.length(); i++){
int n = s.charAt - 48;
r += n * m;
m = 10 * m;
}ممكن تشرحلي شو عم يعمل الكود هون :
mul bl
mov dx,offset bin
add dx,ax
mov ah,09h
int 21h
inc si
jmp @B
@@:
;-
mov ax, 4C00h
int 21hملاحظة: حاولت جمّع الكود عطاني خطأً :
Assembling: C:\bcdtobin\bcdtobin.asm C:\bcdtobin\bcdtobin.asm(26) : error A2070: invalid instruction operands C:\bcdtobin\bcdtobin.asm(5) : error A2004: symbol type conflict C:\bcdtobin\bcdtobin.asm(61) : warning A4023: with /coff switch, leading underscore required for start address : start _ Assembly Error Press any key to continue . . .
Speed_Of_Light كتب:X أنا بظن إن المطلوب التحويل الفعلي بين الـ BCD والـ Binary
لكن 13479 ليست BCD وإنما decimal عادية، الـ BCD هو تقسيم الرقم إلى مراتب، كل مرتبة تشكل digit مستقل، (13479 مثلاً كل مرتبة هي رقم مستقل, 1,3,4,7,9)، وكل مرتبة يتم تمثيلها بـ 4بت بصيغة ثنائية binary-coded (على اعتبار أن الأرقام من 0-9 ممكن تمثيلها بـ 4 بتات من 0000 حتى 1001)
لذا لو قلنا number = 13479 فيكون الـ BCD = 00010011010001111001
اقتباسممكن تشرحلي شو عم يعمل الكود هون :
mul bl mov dx,offset bin add dx,ax mov ah,09h int 21h inc si jmp @B @@: ;- mov ax, 4C00h int 21h
الرقم الذي يتم تحميله في al بالسطر
mov al,[si]
يتم اعتباره كـ offset (أو بمعنى آخر كـ case ضمن حلقة Switch..Case)
لو كان لديك AL = 3 مثلاً فيتم ضربه بالقيمة 5 المحمّلة ضمن المسجل BL مسبقاً، ويكون الناتج 15d، أصبح لديك الآن offset أضفه إلى base address محمّل في المسجّل DX والذي يشير إلى أول بايت في السلسلة bin فيصبح لديك مؤشر [DX+AX] (مجازاً) وهذا سيخبر المقاطعة 21h/الخدمة 09h بأن النص المطلوب إظهاره موجود في العنوان bin+15 أي يشير إلى "0011" السلسلة الخاصة بالرقم 3 وهو ما تم تحميله مسبقاً في AL وهو الرقم الذي أساساً تم جلبه من سلسلة الأرقام المدخلة من قبل المستخدم.
لماذا BL = 5 ؟ لأنه الطول المطلوب تجاوزه في كل خطوة ضمن السلسلة bin وهو يمثل 4 محارف أسكي + $ التي تشير إلى نهاية السلسلة بالنسبة لبرنامج DOS.
طبعاً inc si لزيادة قيمة SI بمقدار واحد حتى يتم التأشير على الـ digit التالي في السلسلة، ونهاية الخدمة 4Ch الخاصة بإنهاء البرنامج يتم طلبها من 21h.
تم تعديل هذه المشاركة بواسطة Xacker في 11 ديسمبر 2009 في 16:24
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
بالنسبة للأخطاء أخبرني كيف تقوم بتجميعه؟
ملف make أم من خلال قوائم MASM أم .. ؟
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
المطلوب التحويل من BCD إلى binary
طبعاً بالنهاية كل شيئ binary
:D
يعني من 00010011010001111001 إلى 11010010100111
-----------------------
اقتباسلماذا BL = 5 ؟ لأنه الطول المطلوب تجاوزه في كل خطوة ضمن السلسلة bin وهو يمثل 4 محارف أسكي + $ التي تشير إلى نهاية السلسلة بالنسبة لبرنامج DOS.
هذا هو المطلوب :)
-----------------------
قمت بالتجميع عبر الـ MASM32 Editor
أي: qeditor.exe
وجربت أيضاً الـ WinASM
Speed_Of_Light:
الخطأ هو في استخدام مجمع 32 بت واستخدام امر تجميع لل 32 بت
استخدم مجمع masm 6 وما قبل .
Speed_Of_Light كتب:المطلوب التحويل من BCD إلى binary
طبعاً بالنهاية كل شيئ binary
:D
يعني من 00010011010001111001 إلى 11010010100111
-----------------------
هذا هو المطلوب :)
كلامك صحيح. سأعيد كتابة البرنامج إن شاء الله.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
السلام عليكم ورحمته الله وبركاته
انا مشكورة الكم على البرنامج كتير
بس وانا بتطبق في اعطني مشكله في هذا الكود @@ في السطر 42
وانا بستعمل في المعالج 8086
يارت تحكيلي ليه اعطاني مشكله وتحكيلي هذا الكود شو بعمل
مرحبااااا
لوسمحته ساعدوني بسرعه
هاد الكود ما بزبط على 8086 وانا لازم ابرمجه 8086
كيف ممكن اني احوله الي 8086 ونوع الملف com
والكم جزيل الشكر
البرنامج بعد التعديل
يقوم بالتحويل من BCD إلى Binary
* أتمنى إعلامي في حال اكتشاف أخطاء فقد كتبته في عجلة وعلى فترات متقطعة.
assume cs:cseg,ds:dseg,ss:sseg cseg segment start: mov ax,dseg mov ds,ax ;- mov dx,offset msg mov ah,09h int 21h ;- mov dx,offset buff mov ah,0Ah ; buffered input (check: http://www.ctyme.com/intr/rb-2563.htm) int 21h ;- mov dx,offset CRLF mov ah,09h int 21h ;- ; now [buff+1] = number length *i.e (1234) = 4* ; and [buff+2] = offset of actual number mov si,offset buff ; si = [buff] xor ax,ax xor dx,dx mov al,[si+1] mov bx,4 div bx .if (dx != 0) mov dx,offset lenErr mov ah,9 int 21h jmp terminate .endif add si,2 ; si = [buff+2] mov di,offset num .while (byte ptr [si] != 0Dh) .if ([si] == "00") .if ([si+2] == "00") mov [di],"0" .elseif ([si+2] == "10") mov [di],"1" .elseif ([si+2] == "01") mov [di],"2" .else mov [di],"3" .endif inc di add si,4 .elseif ([si] == "10") .if ([si+2] == "00") mov [di],"4" .elseif ([si+2] == "10") mov [di],"5" .elseif ([si+2] == "01") mov [di],"6" .else mov [di],"7" .endif inc di add si,4 .elseif ([si] == "01") .if ([si+2] == "00") mov [di],"8" .elseif ([si+2] == "10") mov [di],"9" .else mov dx,offset NotInTheRange mov ah,9 int 21h jmp terminate .endif inc di add si,4 .else mov dx,offset NotInTheRange mov ah,9 int 21h jmp terminate .endif .endw mov [di],"$" ;- mov dx,offset decimal mov ah,9 int 21h mov dx,offset num int 21h mov dx,offset CRLF int 21h ;- mov si,offset num xor ax,ax xor cx,cx mov bx,10 mov al,[si] inc si .while (al != "$") sub al,"0" ;lea cx,word ptr [ax+cx*10] xor ah,ah push ax mov ax,cx mul bx pop cx add cx,ax mov al,[si] inc si .endw .if (dx != 0) ; dx != 0 --> data are spanned over DX:AX which means its larger than 0FFFFh boundary mov dx,offset boundaryErr mov ah,9 int 21h jmp terminate .endif ;- ;cx holds the hexa form mov si,offset bin mov ax,cx mov bx,2 .while (1) xor dx,dx div bx .if (ax == 0) .if (dx == 0) mov [si],"0" .else mov [si],"1" .endif .break .endif .if (dx == 0) mov [si],"0" .else mov [si],"1" .endif inc si .endw inc si mov [si],"$" ;- mov si,offset bin xor bx,bx mov al,[si] .while (al != "$") inc bx inc si mov al,[si] .endw mov si,offset bin mov di,offset binary dec bx @1: cmp bx,0 jl @2 mov al,[si+bx] mov [di],al inc di dec bx jmp @1 @2: mov [di],"$" ; mov dx,offset bin@ry mov ah,9 int 21h mov dx,offset binary int 21h terminate: ;- mov ax, 4C00h int 21h cseg ends dseg segment byte msg db 'enter a number: ','$' lenErr db 'invalid number length','$' NotInTheRange db 'invalid numbers range','$' decimal db 'decimal: ','$' bin@ry db 'binary: ','$' bin db 25 dup (0) binary db 25 dup (0) CRLF db 0Dh,0Ah,'$' num db 20 dup (0) buff db 21,22 dup (0) dseg ends sseg segment stack db 100h dup (?) sseg ends end start
تم تعديل هذه المشاركة بواسطة Xacker في 21 ديسمبر 2009 في 16:32
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
السلام عليكم ورحمته الله وبركاته
مشكور يااخي على تعبك مع بس انت بتستخدم 32bit ونا في حاجه 16 bit
هادي محولاتي بس يوجد خطأ ومش عارفه شو السبب في الخطا
#make_COM#
; COM file is loaded at CS:0100h
ORG 100h
.madl small
.stack 100h
.data
binary dw ?
.code
main proc
mov ax,@data
mov ds,ax
mov ah,01h
mov binary,cx
jcxz stop
mov bx,binary
xor cx,cx
mov cx,16
print:
mov bx,2
mov dl,'0'
test bx,1000000000000b
je zero
mov dl,'1'
zero:
int 21h
shl bx,1
mov dl,'b'
int 21h
push dx
push ax
push si
make db ? ;used us flag
ten dw 10 ;used as multplier
process:
mov cx,0
mov cs:make ,0
next_digt:
mov al,[si]
jne not_end
jmp stop_input
not_end:
cmp al,'-'
jne ok_digit
mov cs:make ,1
jmp next_digit
ok_digit:
push ax
mov ax,cx
mul cs:ten
mov cx,ax
sub al,30h
mov ah,0
mov dx,cx
add cx,ax
jmp next_digit
stop_input:
cmp cs:make,0
je not_min
neg cx
oot_min:
pop si
pop ax
pop dx
ret
main endp
end main
ولكم جزيل الشكر
سوزان الحنبلي كتب:مشكور يااخي على تعبك مع بس انت بتستخدم 32bit ونا في حاجه 16 bit
أختي يعني معقول أنا أكتب الكود السابق وما أعرف لو كنت بستخدم 32بت أو 16بت برأيك؟
أختي كل register من الشكل AX/BX/CX/DX/SI/DI هو 16بت
أما كل مسجل اسمه مسبوق بـ 'E' مثل EAX/EBX/../EDI فهذه 32بت.
وبالمختصر كل الكود السابق موّجه لـ 16bit لكن مختلطة الأمور عندك عشان الدراسة الجامعية عندنا الحمد لله.. بتلقّن الطلاب المعلومة بالملعقة بيخرج الطالب بيعرف 1...2...3 لو شاف 1...3...2 بيضيع :wacko:
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
قمت بالتعديل على الكود السابق بالشكل الذي ربما يتم تدريسكم إياه (to feel more comfortable!)
بالمناسبة بعد التجميع ببساطة غيري الاسم من BCD.exe إلى BCD.com ولن يكون هناك أي اختلاف.
أو باعتبار أنكم تستخدمون emu8086 فأتصور يكفي إضافة #make_com#
.model small .stack 100h .data msg db 'enter a number: ','$' lenErr db 'invalid number length','$' NotInTheRange db 'invalid numbers range','$' boundaryErr db 'boundary error, number is larger than 65535','$' decimal db 'decimal: ','$' bin@ry db 'binary: ','$' bin db 25 dup (0) binary db 25 dup (0) CRLF db 0Dh,0Ah,'$' num db 20 dup (0) buff db 21,22 dup (0) .code start: mov ax,@data mov ds,ax ;- mov dx,offset msg mov ah,09h int 21h ;- mov dx,offset buff mov ah,0Ah int 21h ;- mov dx,offset CRLF mov ah,09h int 21h ;- mov si,offset buff xor ax,ax xor dx,dx mov al,[si+1] mov bx,4 div bx .if (dx != 0) mov dx,offset lenErr mov ah,9 int 21h jmp terminate .endif add si,2 mov di,offset num .while (byte ptr [si] != 0Dh) .if ([si] == "00") .if ([si+2] == "00") mov [di],"0" .elseif ([si+2] == "10") mov [di],"1" .elseif ([si+2] == "01") mov [di],"2" .else mov [di],"3" .endif inc di add si,4 .elseif ([si] == "10") .if ([si+2] == "00") mov [di],"4" .elseif ([si+2] == "10") mov [di],"5" .elseif ([si+2] == "01") mov [di],"6" .else mov [di],"7" .endif inc di add si,4 .elseif ([si] == "01") .if ([si+2] == "00") mov [di],"8" .elseif ([si+2] == "10") mov [di],"9" .else mov dx,offset NotInTheRange mov ah,9 int 21h jmp terminate .endif inc di add si,4 .else mov dx,offset NotInTheRange mov ah,9 int 21h jmp terminate .endif .endw mov [di],"$" ;- mov dx,offset decimal mov ah,9 int 21h mov dx,offset num int 21h mov dx,offset CRLF int 21h ;- mov si,offset num xor ax,ax xor cx,cx xor dx,dx mov bx,10 mov al,[si] inc si .while (al != "$") sub al,30h xor ah,ah push ax mov ax,cx mul bx pop cx add cx,ax mov al,[si] inc si .endw .if (dx != 0) ; dx != 0 --> data are spanned over DX:AX which means its larger than 0FFFFh boundary mov dx,offset boundaryErr mov ah,9 int 21h jmp terminate .endif ;- mov si,offset bin mov ax,cx mov bx,2 .while (1) xor dx,dx div bx .if (ax == 0) .if (dx == 0) mov [si],"0" .else mov [si],"1" .endif .break .endif .if (dx == 0) mov [si],"0" .else mov [si],"1" .endif inc si .endw inc si mov [si],"$" ;- mov si,offset bin xor bx,bx mov al,[si] .while (al != "$") inc bx inc si mov al,[si] .endw mov si,offset bin mov di,offset binary dec bx @1: cmp bx,0 jl @2 mov al,[si+bx] mov [di],al inc di dec bx jmp @1 @2: mov [di],"$" ; mov dx,offset bin@ry mov ah,9 int 21h mov dx,offset binary int 21h terminate: ;- mov ax, 4C00h int 21h end start
تم تعديل هذه المشاركة بواسطة Xacker في 19 ديسمبر 2009 في 10:51
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
السلام عليكم ورحمته الله وبركاته
ياخ والله مع حق انه الجامعات بتعطي المواد بجمود قاتل وانا بعاني من هل برنامج
بس رح اغلب اني جربت البرنامج وصار عندي خطا في هذا الكود
.if (dx != 0)
mov dx,offset lenErr
mov ah,9 i
nt 21h
jmp terminate
وبعرف اني غلبتكم مع بس انتو منفذي الوحيد لفهمي هذه البرمجيه
ولكم جزيل الشكر
طيب أختي على الأقل نحتاج إلى نص رسالة الخطأ بالضبط كما يظهر :(
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…