تغیر این کد اسمبلی !

mi_3

New Member
سلام دوستان این عکس رو نگاه کنید
من میخوام به جا عدد کامل عدد اول رو برسی کنه
ممنون
 

پیوست ها

  • untitledee.JPG
    untitledee.JPG
    117.7 کیلوبایت · بازدیدها: 4

the_king

مدیرکل انجمن
سلام دوستان این عکس رو نگاه کنید
من میخوام به جا عدد کامل عدد اول رو برسی کنه
ممنون

این کد مربوط به یک کتابه؟ کد اش اشتباهه، MOV AX,x قابل اجرا نیست چون x یک بایت (DB) تعریف شده است و AX دو بایت است.

کد:
datasg	SEGMENT
x	DB 5
datasg	ENDS
;----------------------------
codesg	SEGMENT
ASSUME	DS:datasg,CS:codesg
main	PROC FAR
MOV	AX,datasg
MOV	DS,AX
;******************
MOV	CX,1
MOV	BL,1
l1:
INC	BL
CMP	BL,x
JE	exit
MOV	AL,x
MOV	AH,0
DIV	BL
CMP	AH,0
JNE	l1
MOV	CX,0
exit:
;******************
MOV	AX,4C00h
INT	21h
main	ENDP
codesg	ENDS
;----------------------------
END main

تعریف کردن سگمنت به روش بالا قدیمی و منسوخ ئه، اسمبلر های جدید تر نوشتن کد رو ساده می کنند :
کد:
.MODEL SMALL
.DATA
	x	DB 5
.CODE
	.STARTUP
	MOV	CX,1
	MOV	BL,1
l1:
	INC	BL
	CMP	BL,x
	JE	l2
	MOV	AL,x
	MOV	AH,0
	DIV	BL
	CMP	AH,0
	JNE	l1
	MOV	CX,0
l2:
	.EXIT
.STACK
END
 

mi_3

New Member
ممنون استاد
چند تا سوال :

شما عرض کردید MOV AX,x قابل اجرا نیست چون x یک بایت (DB) تعریف شده است و AX دو بایت است.
اما تو کد mov ax,x نداره !! بعد اگه ایکس یه بایت باشه تو دو بایت جا نمیشه ؟؟؟

سوال دوم :شما از چه اسمبلری استفاده کردید
سوال اخر : این برنامه ای که نوشتید چیکار میکنه ؟؟؟ تو سوال کتاب عدد کامل رو برسی میکنه. من میخواستم عدد اول رو برسی کنه ؟ ایا کد شما عدد اول برسی کرده ؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون استاد
چند تا سوال :

شما عرض کردید MOV AX,x قابل اجرا نیست چون x یک بایت (DB) تعریف شده است و AX دو بایت است.
اما تو کد mov ax,x نداره !! بعد اگه ایکس یه بایت باشه تو دو بایت جا نمیشه ؟؟؟
مساله جا شدن و نشدن نیست، تعریف دستور MOV طوری یه که یک داده با حجم مشخص رو از یک جا به جای دیگری منتقل کنه،
نمی تونه حجم داده رو در حین انتقال تغییر بده، نه می تونه بزرگترش کنه و نه کوچکتر. به همین جهت انتقال از یک بایت به دو بایت یا برعکس برایش تعریف نشده.

assmebly.gif


سوال دوم :شما از چه اسمبلری استفاده کردید
من از ML (اسمبلر MASM نسخه 6.11) استفاده می کنم.

سوال اخر : این برنامه ای که نوشتید چیکار میکنه ؟؟؟ تو سوال کتاب عدد کامل رو برسی میکنه. من میخواستم عدد اول رو برسی کنه ؟ ایا کد شما عدد اول برسی کرده ؟
این کد مساله زیر رو حل می کنه :
فرض کنید متغیری با داده مشخص در سگمنت داده تعریف شده (متغیر x)، برنامه ای بنویسید که اگر یک عدد اول بود در CX، مقدار یک و اگر اول نبود در CX، مقدار صفر را کپی کند.
 

-Mitra

Member
ممنون استاد
ببخشید میشه از برچست l1 به بعد کنار خط هاش برام بگید این خط چیکار میکنه ممنوننن
 

the_king

مدیرکل انجمن
ممنون استاد
ببخشید میشه از برچست l1 به بعد کنار خط هاش برام بگید این خط چیکار میکنه ممنوننن

ابتدا مقدار BL رو یک واحد افزایش می دهیم، قبل از l1 مقدارش 1 بود پس اولین بار که این دستور اجرا می شود 2 خواهد شد، ما بعدا x را بر این مقدار تقسیم خواهیم کرد.
کد:
l1:
	INC	BL

اگر BL به مقدار X برسه دیگه نباید حلقه ادامه پیدا کنه...
کد:
	CMP	BL,x

و اگر چنین بود می پریم به l2
کد:
	JE	l2

وگرنه مقدار X رو در AL می خوانیم...
کد:
	MOV	AL,x

و مقدار AH رو صفر می کنیم تا AX (ترکیب AH و AL) برابر x باشد...
کد:
	MOV	AH,0

مقدار AX که همان مقدار x است بر BL تقسیم می کنیم...
کد:
	DIV	BL

اگر باقیمانده تقسیم (AH) صفر باشد مقدار x بر BL بخشپذیر بوده و طبیعتا نمی تواند عدد اول باشد...
کد:
	CMP	AH,0

پس اگر صفر نبود و بخشپذیر نیست، حلقه را برای بررسی BL با مقادیر بزرگتر ادامه می دهیم، یعنی می پریم به اول حلقه :
کد:
	JNE	l1

اما اگر صفر بود و بخشپذیر بود، CX را صفر می کنیم و حلقه را ادامه نمی دهیم :
کد:
	MOV	CX,0

و از برنامه خارج می شویم :
کد:
l2:
	.EXIT
 

جدیدترین ارسال ها

بالا