ax testl` eax eax এর বিরুদ্ধে?


118

আমি কিছু সমাবেশ বুঝতে চেষ্টা করছি।

সমাবেশটি নিম্নরূপে, আমি এই testlলাইনে আগ্রহী :

000319df  8b4508        movl   0x08(%ebp), %eax  
000319e2  8b4004        movl   0x04(%eax), %eax  
000319e5  85c0          testl  %eax, %eax  
000319e7  7407          je     0x000319f0  

আমি বুঝতে চেষ্টা করছি এর testlমাঝে %eaxএবং মাঝে %eax? আমি মনে করি যে এই কোডটি গুরুত্বপূর্ণ নয় তার নির্দিষ্টকরণগুলি, আমি কেবল নিজের সাথে পরীক্ষাটি বোঝার চেষ্টা করছি - মানটি কি সর্বদা সত্য হবে না?

উত্তর:


91

এটি eax0 বা তার উপরে বা নীচে কিনা তা পরীক্ষা করে। এই ক্ষেত্রে, eax0 হলে জাম্প নেওয়া হয়।


2
আমি এই জনপ্রিয় উত্তরটিকে "এই টেস্টের জিনিসটি কী, এবং এটি কীভাবে সিএমপি থেকে আলাদা" -এর আরও ভাল ক্যানোনিকাল উত্তরে পরিণত করার জন্য একটি সম্পাদনা করেছি, যা সাজানো রয়েছে। জেই এবং জেজেড সমার্থক শব্দটির অর্থার্থক অর্থ সম্পর্কে মন্তব্য করার জন্য আমার নিজের উত্তরটি আরও নীচে দেখুন। আমার সম্পাদনাটি পর্যালোচনা করুন যেহেতু এটি বেশ বড়, এবং এটি এখনও আপনার উত্তর।
পিটার কর্ডস

@ পিটারকর্ডস আমি এই উদ্দেশ্যটির প্রশংসা করি, তবে আমি আপনার সম্পাদনাটি ফিরিয়ে আনতে যাচ্ছি। 1. আপনার "ভয়েস" আমার থেকে খুব আলাদা এবং এই মুহূর্তে এটি আমার চেয়ে আপনার উত্তরটির মতো অনেক বেশি পড়ে reads ২. আরও সমস্যাযুক্ত হ'ল দৃ the় প্রতিবেদন যে পতাকাগুলি ঠিক একইভাবে বেরিয়ে আসে testএবং এর মধ্যে cmp। হ্যাঁ, আমি বুঝতে পেরেছি কোডির প্রতি আপনার মন্তব্যের ভিত্তিতে এটিই আপনার বিশ্বাস। তবে এটি আমার পোস্টে রাখা আলাদা বিষয়; এটি দৃ an়তার সাথে আমি দাঁড়াতে ইচ্ছুক নই, কেবল কারণ আমি জানি না এটি সব ক্ষেত্রে অভিন্ন কিনা।
ক্রিস জেস্টার-ইয়ং

1
@ পিটারকর্ডস যদি আমি কিছুটা অতিরিক্ত সময় খুঁজে পাই তবে আমি এই উত্তরটি আরও নীতিগত হতে চাই flesh আমি যেমন এটি লিখি তেমনি এটি লিখব, এবং আমি কীভাবে জিনিস লিখি তা সম্পর্কে আমি বেশ বিশেষ। :-) উদাহরণস্বরূপ, আমি লিখি চাই je, jz, cmp, এবং test, এবং জে, JZ, সিএমপি, অথবা পরীক্ষা। আমি সে রকম পিক।
ক্রিস জেস্টার-ইয়ং

1
আমি আমার নিজের উত্তরটি বাড়ানোর চেষ্টা করছিলাম না। আমি আসলে ভুলে গেছি যে আমি যখন এই সম্পাদনাটি করেছি তখন আমি নিজেই এই প্রশ্নের উত্তর দিয়েছি এবং কেবল পরে তা লক্ষ্য করেছি। কেউ এটিকে ঘা মারার পরে আমি কেবল এটির দিকে নজর দিয়েছিলাম এবং একটি ছোট সম্পাদনা হিসাবে খুব বেশি পরিমাণে তুষারপাত শুরু হয়েছিল। কোনও অপরাধ হয়নি যে আপনি এটিকে আবার ঘুরিয়ে দিতে চেয়েছিলেন; এটি কেবল একটি পরামর্শ ছিল এবং এটি অবশ্যই আমার মতো আপনার কাজের মতো পড়ে। আমি যা লিখেছি তার কিছুটা নিয়ে আমার নিজের উত্তরে রেখে দেব।
পিটার কর্ডেস

2
বাহ, আমি আপনার সাথে কী যুক্ত করেছি তা অন্তর্ভুক্ত করার জন্য এই প্রশ্নের আমার উত্তর সম্পাদনা করার পরে, আমি বুঝতে পেরেছিলাম যে জুনে আমি যা লিখেছিলাম তার বেশিরভাগই আমি ডুপ্লিকেট করেছি। ওহো! আমি আমার দাবিটি ব্যাক আপ করার জন্য আরও যুক্তি দিয়ে আপডেট করেছি test a,aএবং cmp $0,aএকই সাথে পতাকাগুলি সেট করেছি; এটি একটি অ-তুচ্ছ দাবি দাবি করার জন্য ধন্যবাদ। পুনরায় টেস্ট বনাম test: সম্প্রতি আমি ইন্টেলের ম্যানুয়ালগুলির মতো অল-ক্যাপগুলি ব্যবহার শুরু করেছি। তবে যখন আমি এটিএন্ডটি মিমোনমিক্স বনাম ইন্টেল স্মৃতিবিদ্যার কথা বলি তখন আমি এটিএন্ডটি-র testbজন্য স্টাইল ব্যবহার করি । আইডি কে যদি তা পঠনযোগ্যতাতে সহায়তা করে।
পিটার কর্ডেস

90

এর অর্থ testহল এবং আর্গুমেন্টগুলি এক সাথে করা এবং ফলাফলটি শূন্যের জন্য পরীক্ষা করা। সুতরাং এই কোড পরীক্ষা করে যদি EAX শূন্য হয় বা না। jeশূন্য হলে লাফিয়ে উঠবে

বিটিডাব্লু, এটি কম নির্দেশ তৈরি করে cmp eax, 0যার চেয়ে কমপ্লায়াররা সাধারণত এইভাবে এটি করবে।


34

পরীক্ষার নির্দেশ অপারেশনগুলির মধ্যে একটি যৌক্তিক AND-অপারেশন করে তবে ফলাফলটি কোনও রেজিস্টারে ফেরত দেয় না। শুধুমাত্র পতাকা আপডেট করা হয়।

আপনার উদাহরণে পরীক্ষার শুল্ক, Eax শূন্য পতাকা নির্ধারণ করবে যদি শূন্য শূন্য হয়, সাইন-পতাকাটি যদি সর্বোচ্চ বিট সেট থাকে এবং কিছু অন্যান্য পতাকাও থাকে।

শূন্য পতাকা সেট করা থাকলে জাম্প ইফুয়াল (জে) নির্দেশটি লাফ দেয়।

আপনি কোডটি আরও বেশি পঠনযোগ্য কোডে এর মতো অনুবাদ করতে পারেন:

cmp eax, 0
je  somewhere

এর একই কার্যকারিতা রয়েছে তবে কিছু বাইটের আরও কোড-স্পেস প্রয়োজন। এই কারণেই সংকলক তুলনার পরিবর্তে একটি পরীক্ষা নির্গমন করল।


3
আসলে, সিএমপি সেখানে কাজ করতে পারে না। এটি, এটি উপস্থাপিত নির্দিষ্ট ক্ষেত্রেটির জন্য কাজ করে, তবে সিএমপি পরীক্ষার চেয়ে পতাকাগুলিকে আলাদাভাবে প্রভাবিত করে, এটি এর পরিবর্তে এবং অভ্যন্তরীণ সাব হওয়ার কারণে। কিছু মনে রাখবেন।
কোডি ব্রোসিওস

4
শূন্যের বিরুদ্ধে পরীক্ষার জন্য এটি পুরোপুরি বৈধ।
নিলস পিপেনব্রিংক

3
তবে পতাকাগুলি পরে আর কী দেখবে তা আপনি জানেন না। পতাকাগুলির প্রভাবগুলি খুব আলাদা, তাই এটি একটি সমস্যা হতে পারে এবং খুব ঘন ঘন এটিও হতে পারে।
কোডি ব্রোসিওস

2
না, কেবলমাত্র পৃথক পৃথক / পদ্ধতি দ্বারা সেট করা পতাকাগুলি বহন এবং ওভারফ্লো হয়, উভয়ই 0 তে সেট করা থাকে the অন্যান্য পতাকাগুলির / মান / পৃথক হবে কারণ সিএমপি সাব এবং পরীক্ষার ব্যবহার এবং ব্যবহার করে।
কোডি ব্রোসিওস

2
@ কোডি ব্রোকিয়াস: test eax, eaxএবং cmp eax, 0উভয়ই সমস্ত পতাকা সেট করে এবং অভিন্ন মানগুলিতে সেট করে। উভয় নির্দেশাবলী "ফলাফল অনুসারে" সমস্ত পতাকা সেট করে। বিয়োগ 0কখনই বহন বা ওভারফ্লো উত্পাদন করতে পারে না। আপনার যুক্তি 0 ছাড়া অন্য যে কোনও তাত্ক্ষণিকের জন্য সঠিক, তবে 0 এর জন্য নয়
পিটার কর্ডেস

22

testএর মতো and, এটি কেবল FLAGS না লিখে এর উভয় ইনপুটটি সংশোধিত রেখে। দুটি ভিন্ন ইনপুট সহ, কিছু বিট সমস্ত শূন্য হয়, বা যদি কমপক্ষে একটি সেট করা থাকে তবে এটি পরীক্ষার জন্য কার্যকর। (উদাহরণস্বরূপ, test al, 3জেডএফ সেট করে যদি EAX 4 এর একাধিক হয় (এবং এর সাথে এর নিম্ন 2 বিট উভয়ই শূন্য থাকে)।


test eax,eaxসমস্ত ফ্ল্যাগ সেট করে ঠিক একই ভাবে cmp eax, 0would :

অপ্রচলিত এএফ (সহায়ক-ক্যারি পতাকা, ASCII / BCD নির্দেশাবলী দ্বারা ব্যবহৃত) ব্যতীত টেস্ট এটি অপরিবর্তিত রেখে দেয় তবে সিএমপি "ফলাফল অনুসারে" সেট করে । যেহেতু শূন্যকে বিয়োগ করা 4 র্থ থেকে 5 তম বিট পর্যন্ত ক্যারি উত্পাদন করতে পারে না, তাই সিএমপিকে সর্বদা এএফ পরিষ্কার করা উচিত।


টেস্টটি ছোট (তাত্ক্ষণিক নয়) এবং কখনও কখনও দ্রুত (সিএমপির চেয়ে বেশি সিপিইউতে তুলনামূলক এবং শাখার ইউওপে ম্যাক্রো ফিউজ করতে পারে)। এটি testশূন্যের সাথে একটি রেজিস্টার তুলনা করার জন্য পছন্দসই প্রতিমা তৈরি করে । এটি একটি পীফোল অপ্টিমাইজেশন যার জন্য cmp reg,0আপনি অর্থগত অর্থ নির্বিশেষে ব্যবহার করতে পারেন।

তাত্ক্ষণিক 0 দিয়ে সিএমপি ব্যবহারের একমাত্র সাধারণ কারণ হ'ল আপনি যখন মেমরি অপারেণ্ডের সাথে তুলনা করতে চান। উদাহরণস্বরূপ, cmpb $0, (%esi)অন্তর্নিহিত দৈর্ঘ্যের সি-স্টাইলের স্ট্রিংয়ের শেষে একটি সমাপ্ত শূন্য বাইট পরীক্ষা করতে।


AVX512F যোগ করেkortestw k1, k2 এবং AVX512DQ / BW (Skylake-X তবে কেএনএল নয়) যুক্ত করে ktestb/w/d/q k1, k2, যা AVX512 মাস্ক রেজিস্টারে (k0..k7) চালিত করে তবে এখনও নিয়মিত FLAGS সেট testকরে যেমন পূর্ণসংখ্যা ORবা ANDনির্দেশাবলী করে। ( ptestএসএসই 4 বা এসএসই এর মতো বাছাই করুনucomiss : সিমডি ডোমেনে ইনপুট দেয় এবং ফলস্বরূপ FLAGS আসে))

kortestw k1,k1কোনও এভিএক্স 512 ফলাফলের তুলনায় এসএসই / এভিএক্স 2 (v)pmovmskb/ps/pd+ testবা প্রতিস্থাপনের ভিত্তিতে শাখা / সেমিওভিসি / সেটসিটি-তে স্টোরিমেটিক উপায় cmp


jzবনামের ব্যবহার jeবিভ্রান্তিকর হতে পারে।

jzএবং jeআক্ষরিকভাবে একই নির্দেশিকা , যেমন মেশিন কোডে একই অপকড। তারা একই কাজ করে তবে মানুষের কাছে বিভিন্ন অর্থগত অর্থ রয়েছে । ডিসেসেমব্লার্স (এবং সাধারণত সংকলকগুলি থেকে asm আউটপুট) কেবল কখনও একটি ব্যবহার করবে, সুতরাং শব্দার্থক পার্থক্যটি নষ্ট হবে।

cmpএবং subতাদের দুটি ইনপুট সমান হলে জেডএফ সেট করুন (যেমন বিয়োগের ফলাফল 0)। je(সমান হলে লাফ দেওয়া) শব্দার্থগতভাবে প্রাসঙ্গিক প্রতিশব্দ।

test %eax,%eax/ and %eax,%eaxআবার ZF সেট করে যখন ফলাফলের শূন্য, কিন্তু না "সমতা" পরীক্ষা আছে। পরীক্ষার পরে জেডএফ আপনাকে দুটি অপারেশন সমান ছিল কিনা তা জানায় না। সুতরাং jz(শূন্য হলে লাফ দেওয়া) শব্দার্থগতভাবে প্রাসঙ্গিক প্রতিশব্দ।


আমি testবিটওয়াইজ andঅপারেশন সম্পর্কে প্রাথমিক তথ্য যোগ করার বিষয়ে বিবেচনা করব , কেবল সমাবেশ শিখার লোকের পক্ষে (এবং অলস / অজ্ঞান হয়ে প্রতি 60 সেকেন্ডে নির্দেশের রেফারেন্স গাইডটি পরীক্ষা করতে অজানা;) :))।
পেড

1
@ পেড g জি: যথেষ্ট ন্যায্য, আমি অনুমান করি যে এই অংশটি অন্য উত্তরে রেখে না দিয়ে এই উত্তরে সমস্ত কিছু দেওয়া ক্ষতিগ্রস্থ হবে না। AVX512 যুক্ত হয়েছে kortest*এবং ktest*আমি যখন ছিলাম তখন।
পিটার

বিটিডাব্লু, এটি মূলত একই প্রশ্নের অন্য সংস্করণের আমার উত্তর হিসাবে একই , তবে আমি সেখানে কর্মক্ষমতা সম্পর্কে আরও স্টাফ বললাম, যেমন সম্ভবত নেহালেমের মতো পুরাতন পি 6-পরিবারের সিপিইউগুলিতে একই মান দিয়ে রেজিস্টারটি পুনরায় লেখার মাধ্যমে রেজিস্টার-পঠন স্টলগুলি এড়ানো সম্ভব নয়।
পিটার কর্ডেস

@ পিটারকর্ডস এটি গ্রহণযোগ্য উত্তর হওয়া উচিত: সম্পূর্ণ এবং প্রযুক্তিগত। গৃহীত পোস্টের মতো নয়, এটি কারও কৌতূহল এবং জ্ঞানের তৃষ্ণা নিবারণ করে। স্যার এটি রাখুন।
প্রোগ্রামারসন

এটি লক্ষ করা উচিত যে পিএফ কম 8 বিটের সমতাতে সেট করা হয়, যা এই ক্ষেত্রে AL হয়।
বাস্তু

5

কোডের এই স্নিপেটটি এমন একটি সাবরুটিন থেকে যা কিছুকে একটি পয়েন্টার দেওয়া হয়েছিল, সম্ভবত কিছু স্ট্রাক্ট বা অবজেক্ট। ২ য় লাইনটি সেই পয়েন্টারটিকে রেফারেন্স দেয়, সেই জিনিস থেকে একটি মান আনতে পারে - সম্ভবত এটি নিজেই পয়েন্টার বা সম্ভবত কেবল কোনও ইনট, তার দ্বিতীয় সদস্য হিসাবে সংরক্ষণ করা (অফসেট +4)। তৃতীয় এবং চতুর্থ লাইনগুলি শূন্যের জন্য এই মানটি পরীক্ষা করে (এটি যদি একটি পয়েন্টার হয় তবে NUL) এবং শূন্য হলে নিম্নলিখিত কয়েকটি ক্রিয়াকলাপটি (দেখানো হয়নি) এড়িয়ে যান।

শূন্যের জন্য পরীক্ষাটি কখনও কখনও তাত্ক্ষণিক আক্ষরিক শূন্য মানের সাথে তুলনা হিসাবে কোড করা হয়, তবে এটি লিখেছেন এমন সংকলক (বা মানব?) সম্ভবত একটি টেস্টেল ওপেন দ্রুত চালিত হবে - পাইপলাইনের মতো আধুনিক আধুনিক সিপিইউ স্টাফকে বিবেচনায় রেখে পুনঃনামকরনের। এটি একই কৌতুকের ব্যাগ থেকে যা XOR EAX, EAX (যা আমি কলোরাডোতে কারও লাইসেন্স প্লেটে দেখেছি!) এর পরিবর্তে সুস্পষ্ট তবে সম্ভবত ধীর মোভ EAX, # 0 (আমি একটি পুরানো স্বরলিপি ব্যবহার করি )।

Asm এ, পার্লের মতো, TMTOWTDI।


3

যদি শূন্য হয় তবে শর্তসাপূর্ণ লাফটি সম্পাদন করবে, অন্যথায় এটি 319e9 এ কার্যকর করা চালিয়ে যাবে


0

কিছু প্রোগ্রামে এগুলি একটি বাফার ওভারফ্লো পরীক্ষা করার জন্য ব্যবহার করা যেতে পারে। বরাদ্দ স্থানের একেবারে শীর্ষে একটি 0 স্থাপন করা হয়। স্ট্যাকের মধ্যে ডেটা ইনপুট দেওয়ার পরে, বরাদ্দ স্থানটি প্রবাহিত হয়নি তা নিশ্চিত করার জন্য বরাদ্দ করা জায়গার একেবারে শুরুতে 0 টির সন্ধান করে।

এটি ওভারফ্লো হয়েছে কিনা তা পরীক্ষা করার জন্য এটি এক্সপ্লিট-এক্সারসাইজসের স্ট্যাক0 অনুশীলনে ব্যবহৃত হয়েছিল এবং যদি সেখানে উপস্থিত ছিল না এবং সেখানে শূন্য থাকে তবে এটি "আবার চেষ্টা করুন" প্রদর্শিত হবে

0x080483f4 <main+0>:    push   ebp
0x080483f5 <main+1>:    mov    ebp,esp
0x080483f7 <main+3>:    and    esp,0xfffffff0
0x080483fa <main+6>:    sub    esp,0x60                     
0x080483fd <main+9>:    mov    DWORD PTR [esp+0x5c],0x0 ;puts a zero on stack
0x08048405 <main+17>:   lea    eax,[esp+0x1c]
0x08048409 <main+21>:   mov    DWORD PTR [esp],eax
0x0804840c <main+24>:   call   0x804830c <gets@plt>
0x08048411 <main+29>:   mov    eax,DWORD PTR [esp+0x5c] 
0x08048415 <main+33>:   test   eax,eax                  ; checks if its zero
0x08048417 <main+35>:   je     0x8048427 <main+51>
0x08048419 <main+37>:   mov    DWORD PTR [esp],0x8048500 
0x08048420 <main+44>:   call   0x804832c <puts@plt>
0x08048425 <main+49>:   jmp    0x8048433 <main+63>
0x08048427 <main+51>:   mov    DWORD PTR [esp],0x8048529
0x0804842e <main+58>:   call   0x804832c <puts@plt>
0x08048433 <main+63>:   leave
0x08048434 <main+64>:   ret

আমি দেখতে পাচ্ছি না যে শূন্য-শূন্যের জন্য একটি নিবন্ধক পরীক্ষা করার এই সুনির্দিষ্ট ক্ষেত্রে এই প্রশ্নোত্তরে কী যুক্ত হয়। বিশেষত যখন cmp DWORD PTR [esp+0x5c], 0/ jz 0x8048427 <main+51>আলাদা মভ-লোড এবং তারপরে টেস্টের চেয়ে আরও দক্ষ হত। শূন্যের জন্য যাচাই করার জন্য এটি খুব কমই সাধারণ ব্যবহার case
পিটার কর্ডস

-4

আমরা দেখতে পারে JG , jle তাহলে testl %edx,%edx. jle .L3আমরা সহজ খুঁজে পাইনি jle মামলা হয় (SF^OF)|ZF, যদি% EdX শূন্য, ZF = 1 হয়, কিন্তু যদি% EdX শূন্য নয় এবং -1, testl পর এর = 0, এবং সান ফ্রান্সিসকো = 1, সুতরাং পতাকাটি = সত্য, এটি জাম্প প্রয়োগ করে s দুঃখিত, আমার ইংরেজিটি দরিদ্র

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.