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

cl /Fa and Multithread.asm

مغلق
بدأه glimps في 6 ديسمبر 2005 · 2 رد · 867 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

ربي يسر و اعن

مترجمات السي تدعم الاسمبلي ليس فقط دعم برمجي بل من الممكن

ان تكتب سي و يكون الناتج اسمبلي تأخذه و تلعب به ثم تستعمل اسمبلر

لترجمته. كتب الاسمبلي الان شحيحة و لا تواكب باي حال من الاحوال التطورات

البرمجية.

فاذا كنت تريد ان تتعلم شئ جديد في الاسمبلي فهذهه هي اسرع - افضل - الطرق:

اكتب برنامجك بالسي او السي بلس بلس ثم استعمل

cl /Fa myprog.cpp

يعني تريد لسبب ما ان تتعلم Multithreading in assembly

Multithread in c

و الناتج باستعمال cl /Fa

; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50215.44 

	TITLE	C:\Documents and Settings\Administrator\multi.cpp
	.686P
	.XMM
	include listing.inc
	.model	flat

INCLUDELIB MSVCRT
INCLUDELIB OLDNAMES

PUBLIC	?side@@3HA    ; side
CONST	SEGMENT
$SG3896	DB	'*** Pointing to a function.', 00H
$SG3897	DB	' --** Hello World! **--', 0aH, 00H
	ORG $+3
$SG3914	DB	'Done!', 0aH, 00H
	ORG $+1
$SG3923	DB	'I The value of I is %d', 0aH, 00H
$SG3924	DB	'I *** The sum is %d', 0aH, 00H
	ORG $+3
$SG3933	DB	'II The value of II is %d', 0aH, 00H
	ORG $+2
$SG3934	DB	'II *** The mul is %d', 0aH, 00H
	ORG $+2
$SG3943	DB	'III The Value of III is %d', 0aH, 00H
$SG3944	DB	'III *** The sum of the three integers is: %d', 0aH, 00H
	ORG $+2
$SG3954	DB	'IVV The Value of IVV is %d', 0aH, 00H
$SG3955	DB	'IVV *** The Sum is %d', 0aH, 00H
	ORG $+1
$SG3959	DB	'%s', 0aH, 00H
CONST	ENDS
_DATA	SEGMENT
?side@@3HA DD	04H    ; side
_DATA	ENDS
PUBLIC	?DataAdd@@YAHPAH@Z 	 ; DataAdd
PUBLIC	?AddThree@@YAHQAH@Z 	 ; AddThree
PUBLIC	?factoria@@YAHH@Z 	 ; factoria
PUBLIC	?addem@@YAHH@Z    ; addem
PUBLIC	?StrPrint@@YAHPAD@Z 	 ; StrPrint
PUBLIC	__$ArrayPad$
PUBLIC	_main
EXTRN	__imp___beginthread:PROC
EXTRN	__imp__printf:PROC
EXTRN	___security_cookie:DWORD
EXTRN	@__security_check_cookie@4:PROC
; Function compile flags: /Odtp
_TEXT	SEGMENT
_str$ = -100   	 ; size = 28
__$ArrayPad$ = -72    ; size = 4
_id1$ = -68   	 ; size = 4
_id3$ = -64   	 ; size = 4
_id2$ = -60   	 ; size = 4
_list$ = -56   	 ; size = 12
_id5$ = -44   	 ; size = 4
_id4$ = -40   	 ; size = 4
_ptr$ = -36   	 ; size = 4
_kll$ = -32   	 ; size = 32
_argc$ = 8   	 ; size = 4
_argv$ = 12   	 ; size = 4
_main	PROC
; File c:\documents and settings\administrator\multi.cpp
; Line 24
	push	ebp
	mov	ebp, esp
	sub	esp, 100 	 ; 00000064H
	mov	eax, DWORD PTR ___security_cookie
	xor	eax, ebp
	mov	DWORD PTR __$ArrayPad$[ebp], eax
	push	esi
	push	edi
; Line 30
	mov	DWORD PTR _list$[ebp], 3
	mov	DWORD PTR _list$[ebp+4], 5
	mov	DWORD PTR _list$[ebp+8], 19	; 00000013H
	mov	DWORD PTR _kll$[ebp], 8
	mov	DWORD PTR _kll$[ebp+4], 1
	mov	DWORD PTR _kll$[ebp+8], 2
	mov	DWORD PTR _kll$[ebp+12], 3
	mov	DWORD PTR _kll$[ebp+16], 4
	mov	DWORD PTR _kll$[ebp+20], 5
	mov	DWORD PTR _kll$[ebp+24], 6
	mov	DWORD PTR _kll$[ebp+28], 7
; Line 32
	mov	ecx, 7
	mov	esi, OFFSET $SG3896
	lea	edi, DWORD PTR _str$[ebp]
	rep movsd
; Line 34
	mov	DWORD PTR _ptr$[ebp], OFFSET ?StrPrint@@YAHPAD@Z; StrPrint
; Line 35
	push	OFFSET $SG3897
	call	DWORD PTR __imp__printf
	add	esp, 4
; Line 36
	push	4
	push	0
	push	OFFSET ?addem@@YAHH@Z  ; addem
	call	DWORD PTR __imp___beginthread
	add	esp, 12    ; 0000000cH
	mov	DWORD PTR _id1$[ebp], eax
; Line 37
	push	4
	push	0
	push	OFFSET ?factoria@@YAHH@Z	; factoria
	call	DWORD PTR __imp___beginthread
	add	esp, 12    ; 0000000cH
	mov	DWORD PTR _id2$[ebp], eax
; Line 38
	lea	eax, DWORD PTR _list$[ebp]
	push	eax
	push	0
	push	OFFSET ?AddThree@@YAHQAH@Z	; AddThree
	call	DWORD PTR __imp___beginthread
	add	esp, 12    ; 0000000cH
	mov	DWORD PTR _id3$[ebp], eax
; Line 39
	lea	ecx, DWORD PTR _kll$[ebp]
	push	ecx
	push	0
	push	OFFSET ?DataAdd@@YAHPAH@Z	; DataAdd
	call	DWORD PTR __imp___beginthread
	add	esp, 12    ; 0000000cH
	mov	DWORD PTR _id4$[ebp], eax
; Line 40
	lea	edx, DWORD PTR _str$[ebp]
	push	edx
	push	0
	mov	eax, DWORD PTR _ptr$[ebp]
	push	eax
	call	DWORD PTR __imp___beginthread
	add	esp, 12    ; 0000000cH
	mov	DWORD PTR _id5$[ebp], eax
; Line 41
	push	20    ; 00000014H
	call	?addem@@YAHH@Z 	 ; addem
	add	esp, 4
; Line 42
	lea	ecx, DWORD PTR _str$[ebp]
	push	ecx
	call	DWORD PTR _ptr$[ebp]
	add	esp, 4
; Line 43
	lea	edx, DWORD PTR _str$[ebp]
	push	edx
	call	DWORD PTR _ptr$[ebp]
	add	esp, 4
	test	eax, eax
	je	SHORT $LN1@main
	push	OFFSET $SG3914
	call	DWORD PTR __imp__printf
	add	esp, 4
$LN1@main:
; Line 53
	xor	eax, eax
; Line 54
	pop	edi
	pop	esi
	mov	ecx, DWORD PTR __$ArrayPad$[ebp]
	xor	ecx, ebp
	call	@__security_check_cookie@4
	mov	esp, ebp
	pop	ebp
	ret	0
_main	ENDP
_TEXT	ENDS
EXTRN	__imp__fflush:PROC
EXTRN	__imp____iob_func:PROC
; Function compile flags: /Odtp
_TEXT	SEGMENT
_sum$ = -8   	 ; size = 4
_i$ = -4   	 ; size = 4
_count$ = 8   	 ; size = 4
?addem@@YAHH@Z PROC    ; addem
; Line 58
	push	ebp
	mov	ebp, esp
	sub	esp, 8
; Line 60
	mov	DWORD PTR _sum$[ebp], 0
; Line 61
	mov	DWORD PTR _i$[ebp], 0
	jmp	SHORT $LN3@addem
$LN2@addem:
	mov	eax, DWORD PTR _i$[ebp]
	add	eax, 1
	mov	DWORD PTR _i$[ebp], eax
$LN3@addem:
	mov	ecx, DWORD PTR _i$[ebp]
	cmp	ecx, DWORD PTR _count$[ebp]
	jg	SHORT $LN1@addem
; Line 62
	mov	edx, DWORD PTR _i$[ebp]
	push	edx
	push	OFFSET $SG3923
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 63
	call	DWORD PTR __imp____iob_func
	add	eax, 32    ; 00000020H
	push	eax
	call	DWORD PTR __imp__fflush
	add	esp, 4
; Line 64
	mov	eax, DWORD PTR _sum$[ebp]
	add	eax, DWORD PTR _i$[ebp]
	mov	DWORD PTR _sum$[ebp], eax
; Line 65
	jmp	SHORT $LN2@addem
$LN1@addem:
; Line 66
	mov	ecx, DWORD PTR _sum$[ebp]
	push	ecx
	push	OFFSET $SG3924
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 67
	call	DWORD PTR __imp____iob_func
	add	eax, 32    ; 00000020H
	push	eax
	call	DWORD PTR __imp__fflush
	add	esp, 4
; Line 68
	xor	eax, eax
; Line 69
	mov	esp, ebp
	pop	ebp
	ret	0
?addem@@YAHH@Z ENDP    ; addem
; Function compile flags: /Odtp
_j$ = -8   	 ; size = 4
_mul$ = -4   	 ; size = 4
_don$ = 8   	 ; size = 4
?factoria@@YAHH@Z PROC    ; factoria
; Line 72
	push	ebp
	mov	ebp, esp
	sub	esp, 8
; Line 74
	mov	DWORD PTR _mul$[ebp], 1
; Line 75
	mov	DWORD PTR _j$[ebp], 1
	jmp	SHORT $LN3@factoria
$LN2@factoria:
	mov	eax, DWORD PTR _j$[ebp]
	add	eax, 1
	mov	DWORD PTR _j$[ebp], eax
$LN3@factoria:
	mov	ecx, DWORD PTR _j$[ebp]
	cmp	ecx, DWORD PTR _don$[ebp]
	jg	SHORT $LN1@factoria
; Line 76
	mov	edx, DWORD PTR _j$[ebp]
	push	edx
	push	OFFSET $SG3933
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 77
	call	DWORD PTR __imp____iob_func
	add	eax, 32    ; 00000020H
	push	eax
	call	DWORD PTR __imp__fflush
	add	esp, 4
; Line 78
	mov	eax, DWORD PTR _mul$[ebp]
	imul	eax, DWORD PTR _j$[ebp]
	mov	DWORD PTR _mul$[ebp], eax
; Line 79
	jmp	SHORT $LN2@factoria
$LN1@factoria:
; Line 80
	mov	ecx, DWORD PTR _mul$[ebp]
	push	ecx
	push	OFFSET $SG3934
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 81
	call	DWORD PTR __imp____iob_func
	add	eax, 32    ; 00000020H
	push	eax
	call	DWORD PTR __imp__fflush
	add	esp, 4
; Line 82
	xor	eax, eax
; Line 83
	mov	esp, ebp
	pop	ebp
	ret	0
?factoria@@YAHH@Z ENDP    ; factoria
; Function compile flags: /Odtp
_result$ = -8   	 ; size = 4
_i$ = -4   	 ; size = 4
_list$ = 8   	 ; size = 4
?AddThree@@YAHQAH@Z PROC 	 ; AddThree
; Line 86
	push	ebp
	mov	ebp, esp
	sub	esp, 8
; Line 88
	mov	DWORD PTR _result$[ebp], 0
; Line 90
	mov	DWORD PTR _i$[ebp], 0
	jmp	SHORT $LN3@AddThree
$LN2@AddThree:
	mov	eax, DWORD PTR _i$[ebp]
	add	eax, 1
	mov	DWORD PTR _i$[ebp], eax
$LN3@AddThree:
	cmp	DWORD PTR _i$[ebp], 3
	jge	SHORT $LN1@AddThree
; Line 92
	mov	ecx, DWORD PTR _i$[ebp]
	push	ecx
	push	OFFSET $SG3943
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 93
	mov	edx, DWORD PTR _i$[ebp]
	mov	eax, DWORD PTR _list$[ebp]
	mov	ecx, DWORD PTR _result$[ebp]
	add	ecx, DWORD PTR [eax+edx*4]
	mov	DWORD PTR _result$[ebp], ecx
; Line 94
	jmp	SHORT $LN2@AddThree
$LN1@AddThree:
; Line 95
	mov	edx, DWORD PTR _result$[ebp]
	push	edx
	push	OFFSET $SG3944
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 96
	xor	eax, eax
; Line 97
	mov	esp, ebp
	pop	ebp
	ret	0
?AddThree@@YAHQAH@Z ENDP 	 ; AddThree
; Function compile flags: /Odtp
_max$ = -12   	 ; size = 4
_sum$ = -8   	 ; size = 4
_i$ = -4   	 ; size = 4
_listt$ = 8   	 ; size = 4
?DataAdd@@YAHPAH@Z PROC    ; DataAdd
; Line 100
	push	ebp
	mov	ebp, esp
	sub	esp, 12    ; 0000000cH
; Line 102
	mov	DWORD PTR _sum$[ebp], 0
	mov	eax, DWORD PTR _listt$[ebp]
	mov	ecx, DWORD PTR [eax]
	mov	DWORD PTR _max$[ebp], ecx
; Line 104
	mov	DWORD PTR _i$[ebp], 1
	jmp	SHORT $LN3@DataAdd
$LN2@DataAdd:
	mov	edx, DWORD PTR _i$[ebp]
	add	edx, 1
	mov	DWORD PTR _i$[ebp], edx
$LN3@DataAdd:
	mov	eax, DWORD PTR _i$[ebp]
	cmp	eax, DWORD PTR _max$[ebp]
	jge	SHORT $LN1@DataAdd
; Line 106
	mov	ecx, DWORD PTR _i$[ebp]
	push	ecx
	push	OFFSET $SG3954
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 107
	mov	edx, DWORD PTR _i$[ebp]
	mov	eax, DWORD PTR _listt$[ebp]
	mov	ecx, DWORD PTR _sum$[ebp]
	add	ecx, DWORD PTR [eax+edx*4]
	mov	DWORD PTR _sum$[ebp], ecx
; Line 108
	jmp	SHORT $LN2@DataAdd
$LN1@DataAdd:
; Line 109
	mov	edx, DWORD PTR _sum$[ebp]
	push	edx
	push	OFFSET $SG3955
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 110
	xor	eax, eax
; Line 111
	mov	esp, ebp
	pop	ebp
	ret	0
?DataAdd@@YAHPAH@Z ENDP    ; DataAdd
; Function compile flags: /Odtp
_str$ = 8   	 ; size = 4
?StrPrint@@YAHPAD@Z PROC 	 ; StrPrint
; Line 114
	push	ebp
	mov	ebp, esp
; Line 115
	mov	eax, DWORD PTR _str$[ebp]
	push	eax
	push	OFFSET $SG3959
	call	DWORD PTR __imp__printf
	add	esp, 8
; Line 116
	mov	eax, 1
; Line 117
	pop	ebp
	ret	0
?StrPrint@@YAHPAD@Z ENDP 	 ; StrPrint
_TEXT	ENDS
END

كما تركت الامر هناك ... هنا ايضا .. تعقد حلقة نقاشية تعليمية ...

البرنامج انا كتبته بغرض تعليمي و ليس غرض احترافي او تعجيزي

اين من يريد التعلم

؟؟؟؟؟

ان شاء الله لي عودة اذا كان هناك زبائن حقيقيين

#2
اقتباس
اكتب برنامجك بالسي او السي بلس بلس ثم استعمل

cl /Fa myprog.cpp

كيف انفذ هذا الامر

وهل تعمل هذه الطريقة مع الاسمبلي 16 بت وضح هذا الامر فانا اموت في مثل هذه الاشياء

تم تعديل هذه المشاركة بواسطة romanof في 7 ديسمبر 2005 في 08:48

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#3

اخي الفاضل لديك compiler c مثلا visual studio 6,7,8 او قبل ذلك

اكتب امر

cl /?

ستجد

/Fa

مع اي برنامج سي - سي بلس بلس سوف تحوله لك لبرنامج اسمبلي

جاهز للاستعمال مع ml صدقني جربها

اذا كان البرنامج مكتوب بالسي بلس بلس دوت نت سوف يتنج Microsoft Intermediate Language

اللغة التحتية للدوت نت شبيه بالاسمبلي. كنت اريد شرحها لكن عدلت عن ذلك عندما لم اجد زبائن.

فالسي تعيش في سلام و ترحب بالاسمبلي .

على فكرة

/FA

تستخدم للتحويل الى list file

و هناك اوامر مشابهة في الgcc و الwatcom و لكن عليك استعمال الاسمبلر المصاحب بعد ذلك للترجمة.

بالنسبة لموضوع ال16 بت استخدم مترجم 16 بت او مترجم قديم

داخل الـWindows Driver Development Kit DDK ستجد

cl.exe masm.exe

bin/bin16

تمام

تم تعديل هذه المشاركة بواسطة glimps في 7 ديسمبر 2005 في 11:33

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

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