الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

high level assembler و assembly32 وش الفرق

مغلق
بدأه b.m.s في 27 يونيو 2005 · 25 رد · 2,334 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

انا درست assembly 16-bit قبل سنتين وكانت يعني تقريبا سهلة

وهذه الايام احاول اراجع بعض اللي تعلمه لاني احتاجه إن شاء الله في بعض مشروعات قريبا

فقلت لنفسي ليش ما نتطور شوي :D ونراجعها بس بالــ assembly 32-bit ونصير بدل ما نكتب ax نكتب eax :o

بس لما بحثت عن كتب عن الــ assembly 32-bit لقيت بعض الكتب تتحدث عن high level assemble

وليقيت اضافات كثيرة انا ما قد شفتها

فالمختصر والمفيد ابي واحد يوضح لي الفرق بين high level assemble وبين assembly 32-bit

وايضا ابي كتاب عن ال assembly 32-bit يتحدث عن اللغة الاساسية لا اريد لغة قريبة من High level

والسلام عليكم ورحمة الله وبركاته

تم تعديل هذه المشاركة بواسطة b.m.s في 27 يونيو 2005 في 15:01

#2

وعليكم السلام ورحمة الله وبركاته

هلا bms نورت قسم الاسمبلى, اولاً HLA هى من إختراع مدرس لغة اسمبلى يحاول ان يبسط الامور لتلاميذه ولكنى لا انصح بها وانصحك بإستخدام masm32, طبعاً هناك اعداء مايكروسفت حيقولو لك استخدم nasm و fasm الخ, ولكن إذا كنت تريد برمجه اسمبلى فى بيئة الوندوز لن تجد افضل من masm32 وهى متوفره مجاناً على هذا الموقع www.masm32.com. فى نفس الاداة يوجد العديد من الامثله لكيفيه إستخدام الاسمبلى فى بيئة 32 كما انه يوجد العديد من ملفات الهيلب ايضاً وستجد العديد من الدروس عن الوندوز والconsole داخل البرنامج...

يوجد ايضاً العديد من الدروس فى المنتدى منها دروس مثبته ودروس غير مثبته ما عليك سوى البحث, ولو كان عندك اى سؤال يمكنك طرحه هنا, وخاصه انك تعرف اسمبلى 16 فالانتقال لن يكون صعباً, الفرق بين 16بت و 32بت هو كالتالى.

انواع المسجلات بدلاً من 16 تصبح 32, لا يوجد segment فى 32بت لان حجم الsegment هو 4 جيجا بايت, نوع الذاكره هو flat model يعنى لن تحتاج للموديلات الكثيره التى كانت تستخدم فى بيئة ال16بت مثل small و tiny الخ..وفى بيئة ال32بت نستخدم دوال الAPI بدلاً من الint كذلك المكدس فهو يحجز تلقائياً فى بيئة ال32بت بعكس ال16بت والذى يجب ان تحدد فيه حجم المكدس...

اعتقد هذه هى كل الاختلافات, واهم إختلاف هو ان ال32بت اسهل بكثير من ال16بت ولكن يحتاج إلى تعود فقط...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

هلا اخوي احمد غريب

والله شوفتك في الموضوع تكفي عن الرد :o

بس ما دام رديت انت تتحمل نتيجة ردك :blink: لأني راح أنهال عليك ببعض الأسئلة :rolleyes:

وانت بكيفيك تجاوب عليها كلها مرة واحده او بالتقسيط :lol:

بسم الله نبدأ الحين الاسئلة :

نزلت masm32 على الجهاز وهذا جزء من كود موجود فيه وابيك اخوي احمد تفسر لي بعضه الله لا يهينك

1) هذا الكود اللي يجي في الheader وش تفسيره

      .486                      
      .model flat, stdcall      
      option casemap :none

2)

;     include files
;     ~~~~~~~~~~~~~
      include \masm32\include\windows.inc
      include \masm32\include\masm32.inc
      include \masm32\include\gdi32.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\Comctl32.inc
      include \masm32\include\comdlg32.inc
      include \masm32\include\shell32.inc
      include \masm32\include\oleaut32.inc

هل يجب تضمين هذه الملفات في كل مرة أريد أن اكتب برنامج

طيب واذا ابي اكتب برنامج في بيئة console هل يجب تضمين هذه الملفات

3)

dlgproc PROTO :DWORD,:DWORD,:DWORD,:DWORD

وش معناه (h)

4)

    .data?
        hInstance dd ?

هذه أخوي أحمد ما تسمى segment ؟ أنا اتذكر الدكتور كان يقول إنها segment طبعا في بيئة 16-bit ما أدري اختلف الموضوع

في بيئة 32-bit ؟

5)

الفرق ما بين invoke وبين call

6) اخيرا والله اخود احمد الكود اللي شفته غريب يعني تقدر تحط string في أي مكان في البرنامج واشياء كثيرة مختلفة

انا راسي وقف :s ممكن تدلني على كتاب عشان اريحك لان كل الكتب عندي عن HLA والدروس والكتب اللي في الروابط

متعطله ما ادري ليش يمكن عشان نقل المنتدى .

وهذا الكودكامل اذا اردت ان تطلع عليه

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

      .486                     ; create 32 bit code
      .model flat, stdcall     ; 32 bit memory model
      option casemap :none     ; case sensitive

;     include files
;     ~~~~~~~~~~~~~
      include \masm32\include\windows.inc
      include \masm32\include\masm32.inc
      include \masm32\include\gdi32.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\Comctl32.inc
      include \masm32\include\comdlg32.inc
      include \masm32\include\shell32.inc
      include \masm32\include\oleaut32.inc

;     libraries
;     ~~~~~~~~~
      includelib \masm32\lib\masm32.lib
      includelib \masm32\lib\gdi32.lib
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\Comctl32.lib
      includelib \masm32\lib\comdlg32.lib
      includelib \masm32\lib\shell32.lib
      includelib \masm32\lib\oleaut32.lib

      FUNC MACRO parameters:VARARG
        invoke parameters
        EXITM <eax>
      ENDM

      include \masm32\include\dialogs.inc

      dlgproc PROTO :DWORD,:DWORD,:DWORD,:DWORD

    .data?
        hInstance dd ?

    .code

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


start:

      mov hInstance, FUNC(GetModuleHandle,NULL)

      call main

      invoke ExitProcess,eax

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

main proc

    Dialog "Bare Bones Dialog", \          ; caption
           "MS Sans Serif",10, \           ; font,pointsize
            WS_OVERLAPPED or \             ; styles for
            WS_SYSMENU or DS_CENTER, \     ; dialog window
            2, \                           ; number of controls
            50,50,150,80, \                ; x y co-ordinates
            1024                           ; memory buffer size

    DlgButton "Cancel",WS_TABSTOP,48,40,50,15,IDCANCEL
    DlgStatic "Bare Bones Dialog Written In MASM32", \
              SS_CENTER,2,20,140,9,100

    CallModalDialog hInstance,0,dlgproc,NULL

    ret

main endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

dlgproc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD


    .if uMsg == WM_INITDIALOG
      invoke SendMessage,hWin,WM_SETICON,1,
                         FUNC(LoadIcon,NULL,IDI_ASTERISK)

    .elseif uMsg == WM_COMMAND
      .if wParam == IDCANCEL
        jmp quit_dialog
      .endif

    .elseif uMsg == WM_CLOSE
      quit_dialog:
      invoke EndDialog,hWin,0

    .endif

    xor eax, eax
    ret

dlgproc endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start

وشكرا لك اخوي احمدوالسلام عليكم ورحمة الله وبركاته

#4

وعليكم السلا م ورحمة الله وبركاته

سوف اجيب على جميع الاسئله بإختصار وتوجد إجابات على بعض الاسئله بتوسع فى دروس الاسمبلى وبالمره اعلم إعلان للدرس إلى كتبته وهو على الرابط التالى:

http://www.arabteam2000.com/forums/index.php?showtopic=47169

السؤال الاول

السطر الاول يحدد المنصة التى سوف يعمل عليها البرنامج بمعنى عندما نكتب 486 يعنى ذلك ان اقل معالج يمكن ان يعمل عليه البرنامج هو 486 ..

بالطبع كلما كان الرقم اكبر كلما كان بإمكاننا إستخدام تعليمات اكثر فمثلاُ هناك تعليمات مثل MMX لانستطيع ان نستخدمها فى 486 لذلك يجب ان نستخدم 586 ..

وفى نفس الوقت عندما نكتب رقم كبير مثل 686 هذا يحرم مستخدمى 586 من تشغيل البرنامج لذلك عليك التاكد اولاً نوع التعليمات التى تستخدمها فى برنامجك وبعد ذلك تختار نوع المعالج..

فى اغلب الاحيان وبالنسبة للمبتدئين يكفى كتابة 386 او 486 كما هو الحال بالنسبة للبرنامج الذى ارفقت شفرته وذلك لان 386 لم يعد موجود على الساحه..

السطر الثانى هو نوع المنصه وكما ذكر فى مداخلتى الاولى المنصه فى النمط المحمى هى flat ولا يوجد غيرها, اما فى نظام الدوس فكان هناك تقسيم للذاكره بطرق مختلفه مثل small و tine الخ

على كل حال اكتب هذا السطر كما هو فى جميع برامجك التى تكتبها لمنصة الوندوز او الـconsole.

السطر الثالث معنى بإختصار ان الحروف الصغيره فى المتغيرات لا تساوى الحروف الكبيره مثل var لا تساوى Var .

السؤال الثانى

هذه السطور ماهى إلا عباره عن اسماء مكتبات, المكتبه windows.inc هى تقريباُ نفس مكتبة windows.h فى لغة السى بلس بلس..

باقى المكتابات ترفقها معى برنامجك على حسب إحتياجات برنامجك على سبيل المثال إذا كان برنامج مجرد برنامج console فلن تحتاج للمكتبه gdi.inc و gdi.lib وهكذا ..

وفى اغلب برامج الconsole لن تحتاج سوى windows.inc و user32 و kernel32 .

السؤال الثالث

معنى هذا السطر هو انك تخبر الكمبايلر ان هناك داله إسمها dlgproc تاخذ 4 مدخلات من نوع DWORD ولكنها موجوده لاحقاُ فى الملف وسيتم إستدعائها قبل ذلك...

نفس هذه الطريقه مستخدمه فى لغه السى عندما تضع إسم الداله فى مقدمة البرنامج حتى تخبر الكمبايلر انها موجوده فى نهاية الملف او فى ملف خارجى..

السؤال الرابع

كما ذكرت سابقاُ لايوجد شيئ إسمه segment فى بيئة 32بت هذا السطر ماهو إلا متغير من نوع DWORD ويمكنك كتابة DWORD بدل dd لو حبيت وقيمته الابتدائيه غير معروفه, لذلك وضعنا علامة إستفهام..

السؤال الخامس

بالنسبه لـinvoke فى هى طريقه مبسطه فى لغه masm32 لإستدعاء الدوال نفرض ان لدينا داله تاخذ 2 متغير على النحو التالى:

function1 A:dword,B:dword

يمكننا إستدعائها بطريقتين فى لغه الـmasm32 إما على النحو التالى:

invoke function1 A,B

او بالطريقة التقليديه وهى على النحو التالى:

push B
push A
call function1

انا افضل الطريقه الاولى لانها اسهل.

المشكله اخى انك بدات ببرنامج معقد للمبتدئين عليك ان تبداء بالبرامج السهله والتى تجدها فى ملف masm32 تحت ICZTUTES . اما بالنسبه لبرامج الـconsole راجع رابط الدروس المثبته وخاصة الدرس الذى وضعت له رابط فى اول المداخله..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#5

جزاك الله خير اخوي احمد وكثر من أمثالك

وراح اراجع الصفحة المذكورة وكمان راح ارجع الى المجلد اللي قلته

وفي النهاية طبعا ما راح نستغني عن خدماتك :D

والسلام عليكم ورحمة الله وبركاته

#6

السلام عليكم ورحمة الله وبركاته

اخوي أحمد عندي بعض الأسئلة أرجو ان تجاوب عليها

1)

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.data
ClassName db "SimpleWinClass",0
AppName  db "Our First Window",0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
	invoke GetCommandLine
	mov    CommandLine,eax
	invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
	invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
	LOCAL wc:WNDCLASSEX
	LOCAL msg:MSG
	LOCAL hwnd:HWND
	mov   wc.cbSize,SIZEOF WNDCLASSEX
	mov   wc.style, CS_HREDRAW or CS_VREDRAW
	mov   wc.lpfnWndProc, OFFSET WndProc
	mov   wc.cbClsExtra,NULL
	mov   wc.cbWndExtra,NULL
	push  hInstance
	pop   wc.hInstance
	mov   wc.hbrBackground,COLOR_WINDOW+1
	mov   wc.lpszMenuName,NULL
	mov   wc.lpszClassName,OFFSET ClassName
	invoke LoadIcon,NULL,IDI_APPLICATION
	mov   wc.hIcon,eax
	mov   wc.hIconSm,eax
	invoke LoadCursor,NULL,IDC_ARROW
	mov   wc.hCursor,eax
	invoke RegisterClassEx, addr wc
	INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInst,NULL
	mov   hwnd,eax
	invoke ShowWindow, hwnd,SW_SHOWNORMAL
	invoke UpdateWindow, hwnd
	.WHILE TRUE
  invoke GetMessage, ADDR msg,NULL,0,0
  .BREAK .IF (!eax)
  invoke TranslateMessage, ADDR msg
  invoke DispatchMessage, ADDR msg
	.ENDW
	mov     eax,msg.wParam
	ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	.IF uMsg==WM_DESTROY
  invoke PostQuitMessage,NULL
	.ELSE
  invoke DefWindowProc,hWnd,uMsg,wParam,lParam  
  ret
	.ENDIF
	xor eax,eax
	ret
WndProc endp
end start

من قواعد السي وأغلب اللغات انك تصرح عن الدالة قبل لا تستخدمها وهذا اللي فعلناه في الدالة WinMain طيب الدالة WndProc كيف استخدمناها قبل لا نقوم بالتصريح عنها (( ملاحظة هذا الكود موجود

جاهز في masm32 ))

2) في رابط موضوع " فهم البرمجه من الاساس, موضوع للنقاش" في الصفحة الثانية وفي الرد 9 ذكرت في المشروع ملف اسمه skeleton.rc

وكتبت في تعريفات لثوابت وقلت انها بلغة السي ؟ رغم اني اعرف لغة السي لكن الكلمات والمكتوبة مثل " BEIGN و END " وغيرها ما هي موجودة

في السي فكيف جاءت ؟!!!

3) في نفس الرد كتبت ملف أسمه skeleton.inc اعدت تعريف جميع الثوابت بس بلغة الاسمبلي ؟ ليش نكتبها بلغة السي إذا بنعيد تعريفها بلغة الأسمبلي ؟

4) كيف يمكن ان أقرأ وأعرض على الشاشة في الاسبملي في تطبيقات console لاني بحثت في ملفات المساعدة ولم أجد شئ ؟

5) اخوي احمد النوافذ التي تكتب بلغة الأسمبلي اسرع في الحركة وأقل حجما من النوافذ المكتوبه بلغة السي او السي ++ وتشبة نوافذ WINDOWS وهذا معروف ولكن سؤالي هل يمكن دمج برنامجين او كثر احمدهم يتحكم بالنوافذ عن طريق

لغة الاسبلي والاخر بلغة السي ++ في برنامج للإستفادة من سرعة الاسمبلي وقوة السي ++ ؟ ممكن اذا كان الشرح طويل توجهني الى رابط او كتاب معين وانا اتولى البحث ؟

واخيرا جزاك الله خيرا اخي حمد ووفقك الله وكثر من أمثالك والسلامعليكم ورحمة الله وبركاته

#7

السلام عليكم

رد السؤال الاول هو ان الداله WndProc لا علاقه لها بلغه الاسمبلى وإنما هى الطريقه التى نبرمج بها الوندوز, لو فتحت اى برنامج بالسى يقوم بعلم برنامج وندوس ستجد نفس الشيئ معى إختلافات بسيطه جداً, إقراء دروس الاخ الشمرى فى قسم السى بلس بلس, لاحظ ايضاً هذا السطر

 mov   wc.lpfnWndProc, OFFSET WndProc

هنى ترى ان الوندوز يستخدم الداله ولكن بطريقه مختلفه, بإختصار الداله WndProc يقوم نظام التشغيل وندوز بإستدعائها كلما جاء امر معين للنافذه .

السؤال الثانى انا لا اقصد ان برنامج الـresource هو بلغه السى ولكن ما قصدته هو ان ملفات الـresource تكتب بنفس الطريقه فى جميع اللغات بما فيهم السى, وذلك لان هذه الملفات تكون ملف object قبل دمجها معى الملف الاصلى للبرنامج.

السؤال الثالث سؤال جميل والسبب بكل بساطه هو ان ملفات الresource لا تفهم لغه الاسمبلى ولغه الاسمبلى لا تعرف التعريفات التى تستخدمها لغه الresource لذلك نعرف الدوال بإستخدام define فى ملف الresouce ثم نعيد تعريفها فى ملف الاسمبلى بإستخدام بإستخدام equ فى ملف الـinc او ملف الasm, لاحظ ان ملف الresouce يتم عمل كمبايل له ثم نقوم بعمل كمبايل لملف الاسمبلى ثم ندمج الملفين بواسطة link لذلك لا ملف الـresouce يعرف محتويات ملف الاسمبلى ولا ملف الاسمبلى يعرف محتويات ملف الـresouce.

السؤال الرابع كنت طرحت العديد من الامثله فى المنتدى كما وضع الاخ chik الله يذكره بالخير ايضاُ العديد من الدروس لو بحثت فى المواضيع القديمه جداً ستجد الكثير وإليك هذا المثال :

 
Title Stack Demo
.486
.model  flat, stdcall
option  casemap: none

include c:\masm32\include\masm32.inc
includelib c:\masm32\lib\masm32.lib
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib

.data
userStrg DB 100 DUP (?)
Msg1 DB " Please Enter String to convert to Upper Case  :",0
Msg2 DB " Your new String after conversion is as follow :",0

.code
start:
invoke StdOut,addr Msg1
invoke StdIn,addr userStrg, sizeof userStrg
lea edx, userStrg
push edx    ;push secound parameter
mov ecx, sizeof userStrg;get size of string
push ecx    ;push it as first parameter
call UpperCase   ;call our subroutine
invoke StdOut,addr Msg2
invoke StdOut,addr userStrg
xor eax,eax
invoke ExitProcess,eax ;exit Program
ret

;###########Here is the Procedure that will use the stack to convert Chars##########
UpperCase:
push    ebp                   ;create stack frame
mov     ebp,esp               ;save base pointer
pushad                        ;push all register to the stack
mov esi,[ebp+12]  ;ebp = ebp, return adress = ebp+4
mov ecx,[ebp+8]   ;first Parameter = ebp+8, secound Parameter = ebp+12
L: mov al,[esi]
cmp AL,'a'
jl no
cmp al,'z'
ja no
sub al,20h
mov [esi],al
no: inc esi
loop L
popad     ;pop all register
mov esp,ebp    ;get stack pointer in position
pop ebp     ;get base pointer back
ret 8     ;clean stack & go back (2 variables = 8 byte)
end start

وطبعاُ عند عمل كمبايل يجب ان تستخدم

/subsystem:console

بدلاً من windows اظنك تعرف ذلك ولكن حبيت انبه فقط...

الحمد لله وصلنا للسؤال الاخير ..

السؤال الخامس والاخير نعم ممكن ويمكن ايضاً كتابة برنامج كامل بالسى وكتابة مكتبات بالاسمبلى ومن ثم إستدعائها من داخل السى, ويمكن عمل ملفات object ثم دمجها داخل الملف التنفيذى معى ملفات السى , وإذا اردت امثله إن شاء الله اقوم بكتابتها ثم وضعها هنا ولكن اصبر قليلاً حتى تتمكن من اساسيات الاسمبلى الاول وإن شاء الله اكبت دروس عن هذا الموضوع, وعلى فكره الموضوع اسهل من ما تتخيل ويتطلب فقط القليل من المعرفه باللغتين.. على كل حال لو وجدت نفسك مستعد لمثل هذه الامثله قل لى وانا اضعها إن شاء الله..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#8
احمد غريب كتب:
الحمد لله وصلنا للسؤال الاخير ..

:D :rolleyes: معليش اخوي احمد أظن ان أسئلتي كثيرة

بس هذا طبعي ما ارتاح الا اذا ألممت بكل شئ في اللغة

وبالنسبة للاساسيات الاسمبلي انا كنت عارفها ايام ما كنت ابرمج بال16 بت اما الحين بعد ما شفت برمجة ال32 بت

وانها اسهل وافضل لكنها ضربت كل القواعد في راسي بس انشاهء اصبر اسبوع بالكثير واجيك واقولك تمام يا أفندم :lol: جاهز

وعندي استفيار أخير بس

وشالفرق ما بين offset و addr في masm32

ومشكور أخوي أحمد وكثر الله خير ووفقك والسلام عليكم ورحمة الله وبركاته

#9

وعليكم السلام

لا اخوى اسئل على راحتك انا كنت امزح معاك واكيد المنتدى مفتوح عشان نساعد الاخوه وانا حقيقاً سعيد جداً انك تطرح اسئله وإن شاء الله راح يجى اليوم إلى نستفيد فيه من خبرات بعض..

السؤال عن الفرق بين addr و offset بسيط جداً وهو إنه ليس هناك فرق فى النتيجه, الفرق الوحيد هو ان addr تستخدم داخل الداله invoke اما offset فهى تستخدم كالمعتاد فى لغه الاسمبلى..

وعملها هو إحضار مؤشر للذاكره بالظبط مثل * فى لغه السى, طبعاً فى لغة الاسمبلى لايوجد شيئ إسمه reference وإنما نتعامل معى المواشرات فقط.

بالنسبه لقواعد اللغه والفرق بين 16 و 32 فليس هناك فرق كبير, ربما وجود برمجة النوافذ هى الجديده فى ال32 ولكن هذه ليس لها علاقه بلغة الاسمبلى وإنما هى من اساسيات الوندوز...

بس خلى بالك لغة الاسمبلى تسبب الادمان يعنى لو اتعودت عليها لن تستطيع تركها وستحتقر جميع اللغات الاخرى, عدى لغة السى لانها بنت عمة الاسمبلى اما الباقى فكله خرابيط ...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#10
احمد غريب كتب:
بس خلى بالك لغة الاسمبلى تسبب الادمان يعنى لو اتعودت عليها لن تستطيع تركها وستحتقر جميع اللغات الاخرى, عدى لغة السى لانها بنت عمة الاسمبلى اما الباقى فكله خرابيط ...

والسلام عليكم

في هذه صدقت :rolleyes: من الحين بدأ الملل من لغة الجافا :D

ومشكور أخوي أحمد والى أقرب سؤال :D

#11

اخوي احمد الحين هذه ()reparg هل هي دالة ولا ماكرو ولا أيش بحثت عنها مالقيت اي تعريف لها لقيتها في ماكرو print

    print MACRO varname:VARARG      ;; display zero terminated string
      invoke StdOut,reparg(varname)
    ENDM
[code]
#12

نعم اخى هذه ماكرو تستدعى ماكرو اخر إسمه reparg انا لم استخدمها من قبل ولكن يمكنك عتابتها فى بسهوله فهى مجرد loop يمر على المعطيات, اما VARARG فهى مجموعه من المعطيات يعنى variable واحد او اكثر..

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#13
اقتباس
*****بس خلى بالك لغة الاسمبلى تسبب الادمان يعنى لو اتعودت عليها لن تستطيع تركها وستحتقر جميع اللغات الاخرى, عدى لغة السى لانها بنت عمة الاسمبلى اما الباقى فكله خرابيط ...****

: )

الاسمبلي 32 تفتح النفس ..

دوال api هي نفسها اللي بالسي ..

والله الواحد بدأ يشتاق لتعلم الاسمبلي ..

تم تعديل هذه المشاركة بواسطة الشـمري في 5 يوليو 2005 في 23:50

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#14

عندي سؤال ملخبطني شوي

هذا الكود

.data

bms dd 1000

الحين لو نفرض إن عنوان bms هو 10

وانه العنوان 1000 في الذاكرة يحتوي على 1

طيب لو قلنا

mov eax , offset bms

راح يكون قيمة الريجيستر eax هو 10 بفرض أن عنوان bms هو 10

طيب لو أقول

lea eax , bms

راح يكون قيمة الريجيستر eax هو 10 بفرض أن عنوان bms هو 10 يعني ان

mov eax , offset bms
lea eax , bms

هذين الامرين متساويين

طيب عند الامر هذا

mov eax , [bms]

راح يكون قيمة الريجيستر eax هو 1

واخيراُ وصلنا إلى مربط الفرس بعد القصة الطويلة

الحين لو أقول

lea eax , [bms]

سوف يقوم بتحميل عنوان عنوان bms ؟ والمفروض ان يقوم بتحميل قيمة bms لان [bms] هو مكان في الذاكرة وعنوانه bms فالمفروض لو يتم تحميل قيمته ؟

السؤال الثاني )

لو عندي رقم و أبي اطبعه هل لازم أحوله الى string ؟ واذا كان لازم أحوله وش الشروط عشان القيمة التحويل تكون صحيحة ؟

#15

عندي سؤال ملخبطني شوي

هذا الكود

.data

bms dd 1000

الحين لو نفرض إن عنوان bms هو 10

وانه العنوان 1000 في الذاكرة يحتوي على 1

طيب لو قلنا

mov eax , offset bms

راح يكون قيمة الريجيستر eax هو 10 بفرض أن عنوان bms هو 10

طيب لو أقول

lea eax , bms

راح يكون قيمة الريجيستر eax هو 10 بفرض أن عنوان bms هو 10 يعني ان

mov eax , offset bms
lea eax , bms

هذين الامرين متساويين

طيب عند الامر هذا

mov eax , [bms]

راح يكون قيمة الريجيستر eax هو 1

واخيراُ وصلنا إلى مربط الفرس بعد القصة الطويلة

الحين لو أقول

lea eax , [bms]

سوف يقوم بتحميل عنوان عنوان bms ؟ والمفروض ان يقوم بتحميل قيمة bms لان [bms] هو مكان في الذاكرة وعنوانه bms فالمفروض لو يتم تحميل قيمته ؟

السؤال الثاني )

لو عندي رقم و أبي اطبعه هل لازم أحوله الى string ؟ واذا كان لازم أحوله وش الشروط عشان القيمة التحويل تكون صحيحة ؟

#16

حياك الله يا bms اسئلتك تنم عن فهم ولذلك تستحق إجابه وافيه...

اولاً بالنسبه للمتغير bms فهو يتم تحويله إلى ذاكره وعندما تكتب

mov eax , offset bms

يقوم الاسمبلر بوضع قيمة هذه الذاكره فى المسجل eax ولنفترض ان الذاكره هى 401000 إذاً المسجل eax يحتوى على الرقم 401000

عندما تكتب

mov eax , [bms]

يقوم الاسمبلر بوضع القيمة التى فى الذاكره 401000 فى المسجل eax وكما هو واضح من مثالك المرفق فهو العدد 1000.

الدالتين

mov eax , offset bms
lea eax , bms

يقومو بعلم نفس الوظيفه وهى تحميل المسجل eax بعنوان المتغير..

فى اخر مثال غيرت المتغير bms بمحتوى المتغير bms يعنى الاسمبلر سيقوم بتحميل القيمه الموجوده فى الذاكره 401000 إلى المسجل eax ,ولكن هذه الطريقه لم تمر على فى البرمجه من قبل ولا اعرف إذا كانت هذه الطريقه صحيحه, لو عندك مثال ياريت تطرحه حتى نرى ما يفعل ..

واخيراُ إذا اردت تحويل اي نوع مثل DWORD او float إلى string يمكنك إستخدم الدوال dwtoa او StrToFloat بالظيط كما تفعل فى لغه السى, هذه هى اسهل طريقه للتحويل بين انواع المتغيرات, وإذا اردت القيام بالعكس يعنى تحويل string إلى DWORD يمكنك إستخدام atodw الخ كل هذه الدوال موجوده بشرح كامل فى ملف help تجده تحت c:\masm32\help وإسم الملف هو MASMLIB.HLP انك ستجد عده ملفات فى نفس المسار يمكنك الاطلاع عليها لانها مفيده...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#17

واخيرا انهيت تعلم الاسملبي بحمد الله ولكن بقي عندي كم استفسار

1) الشرط [iFIDN[i و [iFDIF[i اعرف معناه لكن هل توجد طريقة لحفظه يعني مثلاُ الشرط IFB تعني IF BLANK من الاختصار استدليت على المعنى لكن الشرطين السابقين لا أدري ما الرابط بين الاختصار والمعنى

لأني وجدت في الشرح هذه العبارة

IFIDN arg1, arg2 ;arg1 equals arg2



IFDIF arg1, arg2 ;arg1 does not equal arg2

2) هذا الكود

cubes   LABEL   BYTE           
root    =   1                  
cube    =   root * root * root  
WHILE   cube LE 32767           
    WORD   cube                
    root   =    root + 1        
    cube   =    root * root * root
ENDM

ما معنى LE هل معناها Less or Equal ؟ واذا كان معناها كذا فما هي باقي الرموز المتوفرة للمقارنة ؟

3) احيانا في كتابة الماكرو نحتاج إلى التكرار فمثلا نستخدم FOR لكن في بعض الامثلة أجده يضع قبل FOR رمز % مثل

arglist TEXTEQU <!<3,6,9!>>    
%FOR  arg, arglist

ENDM

مامعنا هذه

4) العلامة هذه في الماكرو % يقولون إنها تحول من الثابت constant إلى النص text فلماذا يرجع هذا الماكروا لاني ألاحظها في أكثر الماكروا ما يرجعون ثوابت يرجعون نص

مثال

@ArgCount MACRO arglist:VARARG
    LOCAL count
    count = 0
    FOR arg, <arglist>
        count = count + 1      ;; Count the arguments
    ENDM
    EXITM %count
ENDM
#19
اقتباس
واخيرا انهيت تعلم الاسملبي بحمد الله

عقبال عندي!! :rolleyes:

طيب انا عندي سؤال

انا حاليا اتعلم الاسمبلي 16 بت

فهل تعلمها ضروري واساسي لتعلم الاسمبلاي 32 بت؟

لانو اذا كانت 32 اسهل وما تعتمد (بدرجة كبيرة) على ال 16 بت فهادا معناه انو ضيعت وقتي :wacko:

بانتظار الرد

#20

حياك الله اخى bms

ردود سريعه

ifidn= if Identical

ifidni= if identical insensitive

فى هذه الحاله لا نفرق بين الاحرف الكبيره والصغيره..

ifdif = if different

ifdifi= if different insensitive

ifdef = if defined

ifndef = if not defined

Exitm= Exit a macro immediatly

بالنسبه للتعربيرات المنطقيه يوجد التالى .

LE = less or equal

LT = less than

GT = Greater than

EQ = equal

NE = not equal

GE = greater than or equal

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#21

السؤالين الاخيرين يحتاج لتوضيح مطول لذلك ساجيب عليهم عندما يكون لدى الوقت الكافى, اما الان فانا مشغول جداً وارجو منك المعذره....

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#22

أخى أحمد غريب ..استجبت لنصيحتك و أقلعت عن HLA ... انتهيت من دراسة كتاب الأخ chik المثبت ... و كدت أبدأ فى تلخيصه و قرأت و تحسن فهمى لكثير مما كتبه الأخ jaas لكن ما فهمته من كلامك هنا أن الأسيمبلى 32 مختلف عن 16 ... فهل أنا أضعت وقتى و بدأت بداية خطأ? و هل أنا تعلمت معلومات تعتبر خاطئة بالنسبة لل 32 ? أم أن من المفيد تعلم 16 فى الأول?

على فكرة وقت فراغى هذه الأيام أقضى معظمه فى منتدى الأسيمبلى و لدى إصرار على التمكن منها لكن أنتظر توجيهات الأخوة الأفاضل ... بماذا تنصحنى الآن ... بارك الله فيك و جعل ما تقومون به فى موازينكم يوم القيامة

#23
مروان عمر كتب:
  لكن ما فهمته من كلامك هنا أن الأسيمبلى 32 مختلف عن 16 ... فهل أنا أضعت وقتى و بدأت بداية خطأ? و هل أنا تعلمت معلومات تعتبر خاطئة بالنسبة لل 32 ? أم أن من المفيد تعلم 16 فى الأول?

اضم صوتي لصوتك

#24

لا بالعكس اساسيات اللغه هى نفسها, الفروق ليست كبيره ربما اهم فارق هو ان ال16 بت يستخدم دوال البيوس وال32 بت يستخدم دوال الـAPI, انا اؤيد ان يبداء الشخص بدراسة ال32 بت مباشرة لانه اسهل من ال16 بت ولكن ذلك لا يعنى ان ما تعلمته فى ال16 ذهب هباً بالعكس يمكنك الاستفاده من كل ما فهمت لان اللغه هى نفس اللغه المستخدمه فى ال32 بت..

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#25

شكرا اخي احمد على ردك الكريم

طمنتي

هذا الموضوع مغلق.

مواضيع مشابهة