ورود

View Full Version : سوال: کمک در مورد دستور cmp در زبان اسمبلی



caspianhero
چهارشنبه 21 دی 1390, 21:35 عصر
با سلام بر دوستان عزیز

میخواستم بدونم کسی دستور cmp را فهمیده ؟؟؟و میتونه یک توضیح مختصر همراه با مثال کدی یا عددی بده؟؟؟!!!:گریه:
یا این کد را
u
...
cmp bx,100
jg end1
cmp cx ,200
jne u
end1:
کسی میتونه این کد را توضیح بده!!؟؟؟

IamOverlord
چهارشنبه 21 دی 1390, 22:09 عصر
دستور cmp یه عملیاتی، رو 2 عدد انجام می ده که بر اساس نتیجه ی نهایی اون عملیات می شه 2 عدد رو با هم مقایسه کرد.
مثلا دستور je می گه که اگه نتیجه ی آخرین عملیات cmp حاکی از اینه که 2 عدد مساوی اند، پرش کن به جایی که مشخّص شده؛ یا jne بر عکس این رو می گه.
و اطلاعات بیش تر در این جا (http://www.emu8086.com/assembler_tutorial/asm_tutorial_07.html).

caspianhero
چهارشنبه 21 دی 1390, 22:50 عصر
سپاس از راهنمایی تان
لطفا از خط اول اون کدی که نوشتم یک توضیح مختصر در مورد تمام خطوط بدبد!!! زیاد منظورتون را نفهمیدم:گریه:
لینکتون هم کار نمیکنه

IamOverlord
پنج شنبه 22 دی 1390, 10:14 صبح
1. مقایسه ی bx با 100
2. اگر bx بزرگ تر بود برو به end1
3. مقایسه ی ؟ با 200
4. اگر ؟ و 200 نامساوی بودند برو به u

این هم از همون لینکی که دادم (http://www.emu8086.com/assembler_tutorial/asm_tutorial_07.html):


Jump instructions that test single flag

JZ , JE Jump if Zero (Equal). ZF = 1 JNZ, JNE
JC , JB, JNAE Jump if Carry (Below, Not Above Equal). CF = 1 JNC, JNB, JAE
JS Jump if Sign. SF = 1 JNS
JO Jump if Overflow. OF = 1 JNO
JPE, JP Jump if Parity Even. PF = 1 JPO
JNZ , JNE Jump if Not Zero (Not Equal). ZF = 0 JZ, JE
JNC , JNB, JAE Jump if Not Carry (Not Below, Above Equal). CF = 0 JC, JB, JNAE
JNS Jump if Not Sign. SF = 0 JS
JNO Jump if Not Overflow. OF = 0 JO
JPO, JNP Jump if Parity Odd (No Parity). PF = 0 JPE, JP

caspianhero
پنج شنبه 22 دی 1390, 12:40 عصر
دوست عزیز ممنون از راهنمایی بسیار دقیقتان:قلب:
فقط یک سئوال کوچک داشتم .ممنون میشم راهنمایی ام کنید
توی خط دوم که نوشتید ( اگر bx بزرگ تر بود برو بهend 1 ) منظورتون این هست که اگر bx بزرگتر از 100 بود بره به end1 یا نه؟؟؟؟

و یک راهنمایی دیگه هم از شما میخواستم اگه مایل هستید کمکم کنید

میخوام برنامه را به صورت ازمایشی روش کار کنم که مثلا اگر عدد n را گرفت :عبارتش را محاسبه و در ax قرا بده؟؟

1^2+2^2+2^3+............n^n
به این صورت هست و از راست خوانده میشه


و سپاس فراوان

IamOverlord
پنج شنبه 22 دی 1390, 17:20 عصر
توی خط دوم که نوشتید ( اگر bx بزرگ تر بود برو بهend 1 ) منظورتون این هست که اگر bx بزرگتر از 100 بود بره به end1 یا نه؟؟؟؟


بله.

و در مورد سوال دوم، مشکلتون کجاست؟

caspianhero
پنج شنبه 22 دی 1390, 18:28 عصر
همه جاش مشکله. اگر شما به زبان اسمبلی وارد هستید: لطفا راهنمایی کنید که چطور این برنامه نوشته میشه؟؟؟ ایا کد نویسی اش زیاد هست یا نه؟؟؟

سپاس بی کران

IamOverlord
پنج شنبه 22 دی 1390, 23:20 عصر
کد نویسیش زیاد نیست (نسبت به برنامه های Assembly:لبخند:)!
ضمنا توی فرمول حتما n باید فرد باشه تا عبارت به n^n ختم بشه.
اینو برات با FASM (http://www.google.com/url?sa=t&rct=j&q=flast%20assembler&source=web&cd=1&ved=0CCgQFjAA&url=http%3A%2F%2Fflatassembler.net%2F&ei=yj4PT5rKOMOg4gSotLjpAw&usg=AFQjCNE1usjtCVmjsMGffr9w8XUw6oagkg) نوشتم :



org 100h
jmp start




n dw ?
i dw ?
j dw ?
sum dw ?
term1 dw ?
term2 dw ?



start:
mov [sum],0
mov [n],3
mov [i],1
loop_i:

mov [term1],1
mov [term2],1
mov [j],1
loop_j:
mov ax,[term1]
mul [i]
mov [term1],ax
inc [i]
mov ax,[term2]
mul [i]
mov [term2],ax
dec [i]

inc [j]
mov ax,[i]
inc ax
cmp [j],ax
jng loop_j
mov ax,[sum]
add ax,[term1]
add ax,[term2]
mov [sum],ax
add [i],2
mov ax,[n]
cmp [i],ax
jng loop_i




; here we print SUM value in AX Regsiter :
; value can NOT has 3 digits! <<<< PROBLEM!


mov ax,55

mov bx,10 ;bx -> divide by 10
DIV Bl ;divide. AL is quotient, AH is Remainder

add al,48 ;any number + 48 = the same number in ASCII
add ah, 48
push ax ;push ax to the stack

mov ah,0x0e ;print to screen
mov bx,0x0007
int 0x10

pop ax ;pop ax back from the stack
mov al,ah ;puts ah into al to print with int 0x10

mov ah,0x0e ;print to screen
mov bx,0x0007
int 0x10







MOV AH,7h
MOV DX,00h
INT 21h

INT 20h

اما یه PROBLEM برای من به وجود اومد!!! : کدی که برای نمایش عدد نوشتم، نمی تونه اعداد 3 رقمی رو Print کنه :خجالت: که تا همین 2 رقمیش :کف: کردم ...

IamOverlord
جمعه 23 دی 1390, 08:04 صبح
سلام،
حلّه!
این هم کد برنامه که با FASM نوشتم:



org 100h
jmp start




n dw ?
i dw ?
j dw ?
sum dw ?
term1 dw ?
term2 dw ?
strsum db "abcde"


start:



mov [sum],0
mov [n],3
mov [i],1
loop_i:

mov [term1],1
mov [term2],1
mov [j],1
loop_j:
mov ax,[term1]
mul [i]
mov [term1],ax
inc [i]
mov ax,[term2]
mul [i]
mov [term2],ax
dec [i]

inc [j]
mov ax,[i]
inc ax
cmp [j],ax
jng loop_j
mov ax,[sum]
add ax,[term1]
add ax,[term2]
mov [sum],ax
add [i],2
mov ax,[n]
cmp [i],ax
jng loop_i




; here we print SUM value in AX Regsiter :
; value can NOT has 3 digits! <<<< PROBLEM!
;
;
;mov ax,55
;
;mov bx,10 ;bx -> divide by 10
;DIV Bl ;divide. AL is quotient, AH is Remainder
;
;add al,48 ;any number + 48 = the same number in ASCII
;add ah, 48
;push ax ;push ax to the stack
;
;mov ah,0x0e ;print to screen
;mov bx,0x0007
;int 0x10
;
;pop ax ;pop ax back from the stack
;mov al,ah ;puts ah into al to print with int 0x10
;
;mov ah,0x0e ;print to screen
;mov bx,0x0007
;int 0x10

mov ax,[sum]
mov bx,strsum

inttostr:
;In bx the offset to the target string
;In ax the unsigned integer to convert to string
;It converts an unsigned integer to an ascii string
push ax
push bx
push cx
push dx
push si
xor cx, cx
;xor dx, dx THIS LINE IS BUGGY.
mov si, 10
label2:
;I divide the number by 10 repeatedly
; and I put the remainders in the stack.
cmp ax, 10
jb label1
;THIS IS THE PLACE FOR xor dx, dx
;CLEAR THE PREVIOUS REMAINDER.
xor dx, dx
div si
push dx
inc cx
jmp label2

label1:
push ax
inc cx
label3:
;I retrive the numbers in the stack and
;I add to them the ascii value for '0' (character).
pop dx
add dx, '0'
mov byte [ds:bx], dl
inc bx
dec cx
jnz label3
;The service 9h of the 21h interrupt prints a string
;terminated by the character '$'
mov byte [ds:bx], '$'





MOV AH,9h
MOV DX,strsum
INT 21h
MOV AH,7h
MOV DX,00h
INT 21h

INT 20h

caspianhero
جمعه 23 دی 1390, 11:14 صبح
خیلی اقایی .ممنون دوست عزیز .خیلی زحمت کشیدی .کدش خیلی زیاد هست مثل این که!!!!!!!!!
ولی باز هم خیلی ممنون:قلب:

xman_1365_x
دوشنبه 26 دی 1390, 04:07 صبح
میخواستم بدونم کسی دستور cmp را فهمیده ؟؟؟و میتونه یک توضیح مختصر همراه با مثال کدی یا عددی بده؟؟؟!!!:گریه:

CMP REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate Compare.

Algorithm:

operand1 - operand2

result is not stored anywhere, flags are set (OF, SF, ZF, AF, PF, CF) according to result.

Example:MOV AL, 5 MOV BL, 5 CMP AL, BL ; AL = 5, ZF = 1 (so equal!) RET C Z S O P A r r r r r r


اما یه PROBLEM برای من به وجود اومد!!! : کدی که برای نمایش عدد نوشتم، نمی تونه اعداد 3 رقمی رو Print کنه :خجالت: که تا همین 2 رقمیش :کف: کردم ...
دو زير برنامه asc2bin & bin2asc در سايت هست كه ميتونيد استفاده كنيد، الگوريتمشو ببنيد مشكلتون حل ميشه
موفق باشي

caspianhero
چهارشنبه 28 دی 1390, 18:54 عصر
با سلام بر دوستان
میخواستم بدونم کسی میتونه بیت توازن یا پریتی را با مثال عددی 1 0 توضیح بدهد؟؟؟ منظورم کاربردش هست و چطور عمل میکنه؟؟؟؟؟؟ http://www.forum.takraghami.com/images/smilies/happy.gif

سپاس

IamOverlord
چهارشنبه 28 دی 1390, 19:19 عصر
یک بیت اضافی که برای کنترل خطا در گروه‌هایی از بیت‌های ارسالی در بین سیستم‌های کامپیوتری، مورد استفاده قرار می‌گیرد. در میکروکامپیوترها، این اصطلاح همراه ارتباطات مودم به مودم میکروکامپیوترها زیاد دیده می‌شود و اغلب نیز برای کنترل صحت کاراکترهای مخابره شده به کار می‌رود. در این روند، کامپیوتر، فرستنده، یک بیت توازن به هر گروه از بیت‌ها (تک تک بایتها) اضافه می‌کند. تنظیم این بیت توازن به نوع توازن مورد استفاده بستگی دارد.
این روش بدین صورت است که ما از توازن زوج یا توازن فرد استفاده می‌کنیم.یعنی تعداد یکها را طبق قرار داد یا زوج می‌کنیم یا فرد، بدین ترتیب براحتی می‌توان داده‌های اشتباه را شناسایی کرد.

ویکی پدیا (http://fa.wikipedia.org/wiki/%D8%A8%DB%8C%D8%AA_(%D8%B1%D8%A7%DB%8C%D8%A7%D9%86 %D9%87))

caspianhero
چهارشنبه 28 دی 1390, 19:52 عصر
سپاس از راهنمایی تان .ولی منظور من این بود که هر کی اگه بلده یک مثال تصویری بزنه که ادم بفهمه منظورش چی هست؟؟؟؟
اگه دوستان دیگه میتونم لطفا راهنمایی کنند؟؟؟؟؟؟؟؟؟؟؟؟
حالا من یک سئوال دیگه داشتم
توی دستورات cmp ما از دستورات پرش شرطی استفاده میکنیم. که براساس فلگ و دستور پرش بعد از مقایسه بدون علامت و دستور پرش بعد از مقایسه علامتدار ...
حالا من میخوام بدونم مقایسه بدون علامت و مقایسه علامتدار چی هستند ؟؟؟؟ یعنی چطور باید بفهمیم عدد علامتدار یا بدون علامت هست؟؟؟؟؟
و یک سئوال دیگه هم داشتم:خجالت: توی دستور پرش بعد از مقایسه بدون علامت ما مثلا jnb داریم ایا این کلمات که مخفف هستند اصل واژه به انگلیسی دارند که بشه حفظ کرد انها را؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

سپاس

IamOverlord
چهارشنبه 28 دی 1390, 20:10 عصر
ببینید شما هستید که تعیین می کنید متغیر از دید علامت دار بهش نگاه بشه یا نه، یعنی علامت دار بودن یا نبودن متغیر از دید شماست. مسلما اعداد بدون علامت محدوده ی + بیش تری رو در بر می گیرند و از این نظر به درد می خورن. همچنین سیستم خوندنشون قطعا باید یه فرقی با سیستم خوندن اعداد علامت دار داشته باشه. به خاطر همین باید تعیین بشه اعداد بدون علامت در نظر گرفته بشن و مقایسه بشن یا با علامت. در ضمن JNB یعنی Jump If Not Below. برای اطلاعات بیش تر از این جا (http://www.penguin.cz/~literakl/intel/intel.html)، این جا (http://www.penguin.cz/~literakl/intel/j.html#JXX) رو مشاهده کنید.

caspianhero
چهارشنبه 28 دی 1390, 20:18 عصر
ممنون.الان شما مثلا میتونید در مورد اعداد علامتدار و بدون علامت مثال بزنید؟؟؟:متفکر:

IamOverlord
چهارشنبه 28 دی 1390, 21:11 عصر
این سایت بهتون نشون می ده قضیه چیه : www.binaryconvert.com (http://www.binaryconvert.com/)
در سیستم بدون علامت (Unsigned) علامت عدد + در نظر گرفته می شه و اعداد مبنای 2 به طور عادی خونده می شن.
اما در سیستم با علامت (Signed) یه Bit برای علامت عدد هست و بقیه ی Bit ها اندازه ی عدد رو مشخص می کنن.
این جا یه مشکلی پیش می آد، این که 2 تا 0 به وجود می آد: 0+ و 0-
برای حل این مشکل در سیستم علامت دار این طوری در نظر می گیرن:
اگر همه ی Bit ها 0 بود، مقدار 0 هست.
اگر خواستیم عددی مثبت از 'یک' تا 'دو به توان (تعداد بیت ها منهای یک)' رو نشون بدیم، به طور عادی نشون می دیم در مبنای 2
اما اگر خواستیم عددی منفی رو نشون بدیم از 'دو به توان تعداد بیت ها' (یعنی حالتی که همه ی بیت ها 1 هستند) کمش می کنیم. که همون قضیه ی متمم هست...
پیشنهاد می کنم اینو ببینی : www.aiapir.com/booklet/Assembly_zinolabedini.pdf

IamOverlord
پنج شنبه 29 دی 1390, 11:25 صبح
در مورد اون قضیه ی نمایش عدد موجود در AX این جا (http://board.flatassembler.net/topic.php?t=13847) هم مطرح کرده بودم، نتیجه گرفتم، گفتم بد نیست شما هم مطلع باشید...:چشمک:

caspianhero
پنج شنبه 29 دی 1390, 11:34 صبح
راستی دوست عزیز چند تا سئوال خیلی اسان داشتم . جوابش را دارم .ولی میخوام بدونم که درست حل کردم یا نه؟؟؟؟؟ لطفا راهنمایی کن؟؟
اولی
Mov AX , -1
not AX
inc AX
دومی
mov AH,128
cbw
not AX
جواب نهایی اش را میخوام.ممنون میشم راهنمایی کنی!!!:قلب:

xman_1365_x
جمعه 30 دی 1390, 18:24 عصر
از ارسال هاي نامرتبط با عنوان تاپيك خودداري كنيد
تاپيك قفل شد
موفق باشيد.