এক্সএইএসএস এর এএসএম এর এফএসএম সংমিশ্রণের আকারটি কীভাবে হ্রাস করবেন?


14

অনুশীলন হিসাবে, আমি x86 বিধানসভা ভাষায় এই চ্যালেঞ্জের জন্য একটি সহজ সমাধান তৈরি করেছি । আমি এটি উইন্ডোজ এফএএসএম দিয়ে চালাচ্ছি। এখানে আমার উত্স কোড:

format PE console
entry start

include 'WIN32A.inc'

section '.text' code executable
start:
    push    char            ; Start at 'A'
    call    [printf]        ; Print the current letter 4 times
    call    [printf]
    call    [printf]
    call    [printf]
    inc     [char]          ; Increment the letter
    cmp     [char], 'Z'     ; Compare to 'Z'
    jle     start           ; char <= 'Z' --> goto start

section 'r.data' data readable writeable
    char    db  'A', 10, 0  ; Stores the current letter

section '.idata' data readable import
    library  msvcrt,   'msvcrt.dll'
    import   msvcrt, printf, 'printf'

আমি যখন এটি সংকলন করি তখন আমার প্রত্যাশার চেয়ে একটি এক্সিকিউটেবল বড় হয়। এখানে একটি হ্যাক্সডাম্প:

https://pastebin.com/W5sUTvTe

আমি লক্ষ্য করেছি যে কোড বিভাগ এবং ডেটা এবং লাইব্রেরি আমদানি বিভাগগুলির মধ্যে প্রচুর খালি জায়গা রয়েছে, পাশাপাশি কোডটিতে এম্বেড থাকা "এই প্রোগ্রামটি ডস মোডে চালানো যাবে না" বলে একটি বার্তা রয়েছে। কোড গল্ফের জন্য উপযুক্ত, কীভাবে আমি আমার উত্স কোডটি একটি ছোট ফাইলটিতে একত্রিত করতে পারি?

পার্শ্ব নোট হিসাবে, stdoutআমদানি msvcrtএবং কল না করে মুদ্রণের আরও ভাল উপায়গুলির জন্য পরামর্শগুলি printfস্বাগত।


@iBug শুনে আমি দুঃখিত। আপনি দয়া করে আমাকে জিজ্ঞাসা করার জন্য আরও উপযুক্ত জায়গা প্রস্তাব করতে পারেন?
ভাসিলেস্কুর

12
নির্দিষ্ট ক্ষেত্রে সাহায্যের golfing জন্য জিজ্ঞাসা @iBug টিপস প্রশ্ন সবচেয়ে স্পষ্টভাবে হয় না -বহির্ভূত এখানে।
অ্যাডমবর্কবার্ক


1
এটি হতে হবে: শুরু করুন: চাপ ধরণের এলবি: কল [প্রিন্টফ] কল [প্রিন্টফ] কল [প্রিন্টফ] কল [প্রিন্টফ] ইন [চর] সিএমপি [চর], 'জেড' জে এলবি কারণ যদি তা না হয় তবে স্ট্যাকটি গ্রাস করতে পারে ;
প্রিন্টফের

1
প্রিন্টফের পরিবর্তে, আপনি কার্নেল 32 (যা ডিফল্টরূপে উপস্থিত রয়েছে, আপনাকে কেবল ঠিকানাটি নির্ধারণ করতে হবে) ছাড়া অন্য কোনও আমদানির প্রয়োজন নেই, WritFile (stdout) করতে পারেন
পিটার ফেরি

উত্তর:


2

বেশ কিছুটা সাধারণ টিপ, তবে

পিই এক্সের পরিবর্তে সিওএম ফাইল ফর্ম্যাট ব্যবহার করুন।

পিই এক্সইএর কয়েকটি ত্রুটি রয়েছে যা কোড-গল্ফের ফর্ম্যাটটিকে বেশ বেশি অকেজো করে তোলে। প্রথমটি হ'ল চিত্র সারিবদ্ধকরণ (উইন্ডোজ EXE ফাইলটি সঠিকভাবে প্রান্তিককরণ না করে চালাবে না), এবং দ্বিতীয়টি শিরোনামের আকার। কয়েকটি কারণ রয়েছে যা এই গুরুত্বপূর্ণ নয় (এক্সিকিউটিভকে বিভাগে বিভক্ত করে)।

COM ফাইল ফর্ম্যাট ব্যবহারের সুবিধা (এটি ফ্ল্যাট বাইনারিগুলির তুলনায় বেশ সমতুল্য):

  • জিরো শিরোনাম কোড, ফাইলটি বিভাগগুলিতে বিভক্ত নয়
  • কোনও চিত্র প্রান্তিককরণ নয় (সুতরাং চিত্রের আকারটি দু'জনের কড়া সংজ্ঞায়িত শক্তির দ্বারা বিভাজ্য নাও হতে পারে, তবে এটি 65 কে এর চেয়ে ছোট হতে হবে though এটি খুব বেশি পরিবর্তন করে না, কারণ যদি আপনার জমাটি 65 কে এর চেয়ে বড় হয়, আপনি করছেন কিছু ভুল).
  • আপনি বাহ্যিক গ্রন্থাগারগুলি ব্যবহার করতে পারবেন না - এটি আসলে একটি প্লাস, কারণ সন্দেহ ছাড়াই আপনার কাছে I / O সঞ্চালনের অন্য উপায় রয়েছে। সেখানেই বায়োস বাধা কার্যকর হয়
  • সিস্টেমের সাথে সংযুক্ত মেমরি এবং ডিভাইসগুলির উপর আপনার সরাসরি নিয়ন্ত্রণ রয়েছে, অতএব এখানে কোনও পেজিং নেই, অ্যাক্সেস লঙ্ঘন নেই, মেমরির সুরক্ষা নেই, কোনও চুক্তি নেই, এবং আরও অনেক কিছু। এই বৈশিষ্ট্যগুলি সত্যই সৃজনশীল প্রোগ্রামগুলি গল্ফ করা সহজ করে তোলে।

ফ্ল্যাট বাইনারি হিসাবে কাজ করতে আমি আপনার কোডটি সংশোধন করেছি। এটি মৃত সহজ:

ORG 100H

MOV DX, P
MOV AH, 9

L:
    INT 21H
    INT 21H
    INT 21H
    INT 21H

    INC BYTE [P]
    CMP BYTE [P], 'Z'
    JLE L

MOV AX, 4C00h
INT 21h

P DB "A", 10, "$"

আউটপুট বাইনারি কেবল 32 বাইট বড়। আমি বিশ্বাস করি, আকার আরও আরও কমানো সম্ভব, তবে এটি কেবল একটি সূচনা পয়েন্ট।

সাথে একত্রিত nasm -fbin file.asm -o file.com। দ্রষ্টব্য, এই উদাহরণটি NASM এর জন্য তৈরি করা হয়েছে তবে আপনি এটিকে FASM এ অবাধে অনুবাদ করতে পারেন এবং এটি নির্দ্বিধায় কাজ করবে।


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