var QUESTION_ID=84260,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
5 16
wprowadzono jako005 016
Odpowiedzi:
Galaretka , 1 bajt
Wypróbuj online!
Działa również w 05AB1E, faktycznie, APL, Braingolf, ,,, (Commata), Factor, Forth, Implicit, J, Julia, K, kdb +, Keg, Ly, MATL, Pyke, Deorst i Q.
źródło
Minecraft 1.10, 221 znaków (nie konkuruje)
Zobacz, z tym mamy do czynienia przy tworzeniu map Minecraft.
Poza tym: w Minecraft nie ma sposobu, aby wprowadzić ciąg znaków, więc oszukuję trochę, wprowadzając liczby do samego programu. (Jest to nieco uzasadnione, ponieważ sporo map, takich jak Minecraft Bingo Lorgon111, wymaga kopiowania i wklejania poleceń do czatu w celu wprowadzenia liczby).
Dziękuję już za filtr MCEdit Block Labels .
Nie konkuruje z powodu trudności z wejściem i nie mam pojęcia, jak liczyć bajty w tej rzeczy (system blytes jest wadliwy dla bloków poleceń).
źródło
0,1,2
Innym rozwiązaniem byłoby przyjęcie 2 bajtów i wyjście na 9 przewodach, ale byłoby znacznie mniej golfaBinarny rachunek lambda , 4,125 bajtów
Dane wejściowe i wyjściowe jako liczby kościelne .
W rachunku lambda jest to λ m . λ n . λ f . λ x . m f ( n f x ).
Indeks De Bruijna : λ λ λ λ 4 2 (3 2 1)
Rachunek lambda to zwięzły sposób opisu odwzorowania (funkcji).
Na przykład to zadanie można zapisać jako λ x . λ y . x + y
Należy zauważyć, że nie jest to lambda (funkcja), która przyjmuje dwa argumenty. To właściwie zagnieżdżona lambda. Zachowuje się jednak jak lambda, która przyjmuje dwa argumenty, więc można go nieformalnie opisać jako taki. Każda lambda formalnie bierze tylko jeden argument.
Na przykład, jeśli zastosujemy tę lambda do 3 i 4:
Tak więc pierwsza lambda faktycznie zwraca inną lambda.
Cyfry kościelne to sposób na pozbycie się dodatkowych znaków, pozostawiając tylko symbole i zmienne lambda.
Każda liczba w systemie kościelnym jest w rzeczywistości lambda, która określa, ile razy funkcja jest stosowana do elementu.
Niech funkcją będzie f, a elementem będzie x .
Tak więc liczba 1 odpowiada λ f . λ x . f x , co oznacza zastosowanie f do x dokładnie raz.
Na przykład liczba 3 to λ f . λ x . f ( f ( f x )), co oznacza zastosowanie f do x dokładnie trzy razy.
W związku z tym, dodanie dwóch cyfr Church (powiedzmy, m i n ) ze sobą, to jest takie same jak zastosowania F do x , m + n razy.
Możemy zauważyć, że jest to to samo, co najpierw zastosowanie f do x , n razy, a następnie zastosowanie f do uzyskanego elementu m razy.
Na przykład 2 oznaczałoby,
f(f(x))
a 3 oznaczałobyf(f(f(x)))
, więc 2 + 3 byłobyf(f(f(f(f(x)))))
.Aby zastosować f do x , n razy, mamy n f x .
Można zobaczyć m i n jako funkcje biorąc dwa argumenty, nieformalnie.
Następnie ponownie stosujemy f do tego wynikowego elementu, m razy: m f ( n f x ).
Następnie dodajemy z powrotem płytę kotła, aby uzyskać λ m . λ n . λ f . λ x . m f ( n f x ).
Teraz musimy przekonwertować go na indeks De Bruijn .
Po pierwsze, liczymy „względną odległość” między każdą zmienną do deklaracji lambda. Na przykład m miałoby odległość 4, ponieważ zadeklarowano 4 jagnięta „temu”. Podobnie, n miałoby odległość 3, f miałoby odległość 2, a x miałby odległość 1.
Piszemy to jako następującą formę pośrednią: λ m . λ n . λ f . λ x . 4 2 (3 2 1)
Następnie usuwamy deklaracje zmiennych, pozostawiając nam: λ λ λ λ 4 2 (3 2 1)
Teraz konwertujemy go na binarny rachunek lambda .
Reguły są następujące:
00
.01 m n
.1
i razy +0
, na przykład 4 staje się11110
.λ λ λ λ 4 2 (3 2 1)
≡ λ λ λ λ
11110
110
(1110
110
10
)≡ λ λ λ λ
11110
110
0101 111011010
≡ λ λ λ λ
0101
111101100101111011010
≡
00
00
00
00
0101
111101100101 111011010
≡
000000000101111101100101111011010
źródło
Common Lisp, 15 bajtów
źródło
(+(read)(read))
Koty stosu , 8 + 4 = 12 bajtów
Uruchom z
-mn
flagami. Wypróbuj online!Gra w Stack Cats jest bardzo sprzeczna z intuicją, więc powyższy program został znaleziony z kilkudniowym brutalnym wymuszaniem. Dla porównania, bardziej intuicyjne, napisane przez człowieka rozwiązanie korzystające z
*(...)>
szablonu ma dwa bajty dłużej-ln
zamiast tego z flagami (wyjaśnienie znajduje się na dole tego postu).Wyjaśnienie
Oto podkład na Stack Cats:
-m
lub-l
. Tutaj-m
używana jest flaga, więc powyższy pół programu faktycznie się rozwija]_:]_!<X>!_[:_[
.<
I>
przesuwa odpowiednio jeden stos w lewo i jeden stos w prawo.-n
oznacza numeryczne we / wy.A oto ślad rozszerzonego pełnego programu
]_:]_!<X>!_[:_[
:a+b
jest następnie wyprowadzany, a podstawa -1 jest ignorowana. Zauważ, że najtrudniejszą częścią tego rozwiązania jest to, że stos wyjściowy musi mieć-1
na dole znak wyjściowy, w przeciwnym razie stos wyjściowy po prostu[-1]
zignoruje podstawę -1, a stos wyjściowy[0]
spowoduje, że podstawa zero zostanie połknięta (ale dane wyjściowe[2]
na przykład stos byłby w2
porządku).Dla zabawy, oto pełna lista znalezionych powiązanych rozwiązań o tej samej długości (lista może być niekompletna):
*(>-_:[:)>
Rozwiązanie jest dłuższy, ale jest bardziej intuicyjny napisać ponieważ używa*(...)>
szablonu. Ten szablon rozwija się,<(...)*(...)>
gdy jest używany z-l
flagą, co oznacza:Jako taki
*(...)>
szablon oznacza, że pierwsza pętla jest pomijana, ale druga jest wykonywana. Pozwala to na prostsze programowanie, ponieważ nie musimy martwić się efektami pętli w drugiej połowie programu.W tym przypadku wnętrze pętli to:
Końcowy
>
w szablonie przenosi nas z powrotem do stosu wejściowego, gdziea+b
jest wyprowadzany.źródło
Uszkodzenie mózgu , 6 bajtów
Wypróbuj online!
Brain-flak to naprawdę interesujący język z dwoma głównymi ograniczeniami.
Jedynymi poprawnymi znakami są nawiasy, tzn. Dowolny z następujących znaków:
Zestaw nawiasów, między którymi nie ma nic, nazywa się „nilad”. Nilad tworzy pewną wartość liczbową i wszystkie te nilady obok siebie są sumowane. Zestaw nawiasów z czymś między nimi nazywa się „monadą”. Monada to funkcja, która przyjmuje argument liczbowy. Zatem nawiasy wewnątrz monady są oceniane, i to jest argument za monadą. Oto bardziej konkretny przykład.
()
Nilad równa 1. zatem następujące mózgu flak kodu:Jest oceniany na 3.
()
Monada wypycha zawartą w nim wartość na stos globalny. Więc następującewypycha 3.
{}
Nilad wyskakuje wartość na stosie. Ponieważ zawsze dodawane są kolejne nilady, ciąg{}
sumuje wszystkie najlepsze elementy na stosie. Więc mój kod to w zasadzie:źródło
Minecraft 1.10.x,
924512 bajtówDzięki @ quat za zmniejszenie blytecount o 48 punktów i bytecount o 412.
W porządku, więc wziąłem niektóre pomysły z tej odpowiedzi i stworzyłem własną wersję, tyle że ta jest w stanie zaakceptować nieujemne dane wejściowe. Wersja znajduje się tutaj w formacie bloku struktury.
(nowa wersja wygląda trochę nudno)
Podobne polecenia jak druga odpowiedź:
Aby wprowadzić liczby, odradzaj się u wielu krów i świń. Krowy będą reprezentować wartość „n”, a świnie będą reprezentować wartość „m”. System blokowania poleceń stopniowo zabija krowy i świnie i przypisuje wartości w razie potrzeby.
Ta odpowiedź zakłada, że jesteś w świecie bez naturalnie występujących krów i świń oraz że wartości zapisane w „n” i „m” są usuwane przy każdym uruchomieniu.
źródło
execute @e[type=Pig] ~ ~ ~ scoreboard players add m a 1
, więc nie potrzebujesz żadnej formy zegara.Siatkówka , 42 bajty
Wypróbuj online!
Wyjaśnienie
Dodawanie liczb w jednostkach jest najłatwiejszą rzeczą na świecie, ale po wprowadzeniu liczb ujemnych sprawy stają się dziwne ...
Zaczynamy od przeliczenia liczb na unary. Odbywa się to poprzez dopasowanie każdego numeru do
\d+
i zastąpienie go$*
. Jest to funkcja substytucji specyficzna dla siatkówki. Pełna składnia tocount$*character
i wstawiacount
kopiecharacter
. Oba można pominąć, gdycount
domyślnie$&
(tj. Samo dopasowanie) icharacter
domyślnie1
. Tak więc dla każdego wejścian
otrzymujemy jen
i nadal mamy potencjalne znaki minus, a także separator przestrzeni. Np. Dane wejściowe8 -5
dają:Teraz, aby radzić sobie z liczbami ujemnymi, najłatwiej jest użyć osobnej
-1
cyfry. Wykorzystamy-
do tego celu.Ten etap robi dwie rzeczy. Pozbywa się spacji, wiodących znaków minus i zamienia
1
s po znaku minus w-
siebie. Odbywa się to poprzez dopasowanie|-1+
(tj. Spację lub liczbę ujemną) i wykonanie transliteracji. Transliteracja przechodzi od1p
do-_
, ale tutajp
rozszerza się na wszystkie drukowalne znaki ASCII i_
oznacza usuń. Więc1
s w tych meczach zamieniają się w-
s, a minusy i spacje są usuwane. Nasz przykład wygląda teraz tak:Ten etap obsługuje przypadek, w którym na wejściu znajduje się jedna liczba dodatnia i jedna ujemna. Jeśli tak, w ciągu będą znajdować się
1
s i-
si chcemy, aby anulowały. Odbywa się to poprzez dopasowanie dwóch znaków z granicą między nimi (ponieważ1
s jest uważane za znak słowny, a-
nie jest), i zastąpienie dopasowania niczym. W+
przesyła zlecenie Retina to zrobić, aż łańcuch zatrzyma się zmienia.Teraz zostaje nam tylko
1
s lub tylko-
s.Aby przekonwertować to z powrotem na dziesiętne, dopasowujemy całe dane wejściowe, ale jeśli to możliwe, przechwytujemy
-
grupę1
.1
Zapisujemy grupę (aby wstawić-
liczby ujemne), a następnie zapisujemy długość dopasowania za pomocą$.&
(także funkcji substytucji specyficznej dla siatkówki).źródło
range
w Retina. Próbowałem kilka razy, ale negatywy to ból.Domino , 38 000 bajtów lub 37 płytek
To jest tworzony w Tabletop Simulator . Oto wideo, a tutaj plik . Jest to standardowy półdodujący, złożony z
and
bramki dla2^1
wartości miejsca ixor
bramki dla2^0
wartości miejsca.Detale
2^1
a po prawej2^0
[Czarny] .100%
źródło
Haskell, 3 bajty
Nawiasy są tutaj, ponieważ musi to być funkcja prefiksu. Jest to to samo, co pobranie sekcji funkcji +, ale nie zastosowano żadnych argumentów. Działa również na wielu różnych typach, takich jak odpowiednio zaimplementowane wektory, macierze, liczby zespolone, zmiennoprzecinkowe, podwajanie, wymierne i oczywiście liczby całkowite.
Ponieważ jest to Haskell, oto jak to zrobić na poziomie typu. Zostanie to wykonane w czasie kompilacji zamiast w czasie wykonywania:
Kod zaadaptowany z Haskell Wiki
źródło
Mathematica,
42 bajtyPrzekreślone
4jest nadal regularne 4 ...Tr
zastosowane do jednowymiarowej listy pobiera sumę elementów wspomnianej listy.źródło
dc, 2 bajty
Dodaje dwa górne elementy na stosie (poprzednio wzięte z
stdin
), a następnie zrzuca zawartość stosu dostdout
.EDYCJA: Po dalszym rozważeniu wydaje się, że można to zaimplementować na kilka sposobów, w zależności od pożądanego zachowania We / Wy.
Podejrzewam, że najbardziej kompletny formularz sumy byłby następujący:
Czekać! Dwie liczby mogą być brane na tej samej linii, oddzielone spacją! To daje nam:
źródło
+f
,dc -e "?+p"
tutaj działa dobrze.+f
Wersja działa, jeśli już umieściłeś (dokładnie dwie) liczby na stosie. Naprawdę nie wiedziałem, czydc
to powinno być we / wy,std(in|out)
czy stos. Z perspektywy czasu była to najmniej sensowna opcja umieszczenia na szczycie postu. : /Język programowania Szekspira ,
155152 bajtówNie golfowany:
Używam kompilatora SPL drsam94 do skompilowania tego. Testować:
źródło
Brachylog , 2 bajty
Oczekuje listy z dwiema liczbami jako danymi wejściowymi
Ewentualnie, jeśli chcesz uzyskać odpowiedź na
STDOUT
:źródło
JavaScript (ES6), 9 bajtów
źródło
PHP, 20 bajtów
Tym razem zaskakująco krótko:
Działa z wiersza poleceń, na przykład:
źródło
php sum.php 1 2 3 4 5 6
więc nie jestem w 100% pewien, czy to w porządku.-r
flagi - to już nie jest problem.Cheddar, 3 bajty
Jest to fajna funkcja Cheddara zwana „operatorami funkcjonalizowanymi”. Podziękowania za ten pomysł należą do @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Oto więcej przykładów funkcjonalizowanych operatorów:
źródło
Python,
113 bajtyint.__add__
Prosty operator specjalny.
źródło
Geometry Dash - 15 obiektów
Wkońcu zrobione.
15 obiektów to niewiele, ale nadal był to koszmar (szczególnie ze względu na liczby ujemne).
Ponieważ musiałbym wstawić tutaj 15 zdjęć w celu odtworzenia tego, właśnie załadowałem poziom. Identyfikator poziomu to 5216804. Opis mówi, jak go uruchomić i możesz go skopiować, ponieważ można go kopiować.
Wyjaśnienie:
Lewy górny wyzwalacz (Natychmiastowa liczba 2) sprawdził, czy pierwszy dodatek miał wartość 0. Jeśli tak, sprawdził, czy drugi dodatek był dodatni czy ujemny. Gdyby było dodatnie, przekazało wartość z drugiego dodatku do sumy (styl BF, używając pętli), a jeśli byłoby ujemne, zrobiłby to samo.
Powodem, dla którego musimy sprawdzić, czy drugi dodatek jest dodatni czy ujemny, jest to, że musielibyśmy odjąć jeden z drugiego dodatku i dodać jeden do sumy lub dodać jeden do drugiego dodatku i odpowiednio odjąć jeden od sumy.
Jeśli pierwszy dodatek nie jest równy zero, sprawdza, czy jest dodatni czy ujemny, korzystając z powyższego procesu. Po jednej iteracji w pętli while sprawdza, czy pierwszy dodatek jest równy zero, a jeśli tak, to wykonuje proces opisany na początku objaśnienia.
Ponieważ Geometry Dash jest niezwykle podobny do BF, możesz z tego zrobić rozwiązanie BF.
źródło
MATL, 1 bajt
Akceptuje tablicę dwóch liczb całkowitych jako dane wejściowe i sumuje je. Podczas gdy prosty program
+
działa również , który został już pokazany dla innych języków.Wypróbuj online
źródło
Perl 5.10, 8 bajtów
Dwie liczby do dodania muszą znajdować się w 2 osobnych wierszach, aby ten działał:
Spróbuj tego tutaj.
Jeden z wejściem w tym samym wierszu ( 14 + 1 bajtów dla flagi -a )
Wypróbuj tutaj!
Jeden z wejściem w tym samym wierszu ( 19 + 1 bajtów dla flagi -a )
Spróbuj tego tutaj.
Kolejny, zmieniając domyślny separator tablicy ( 19 + 1 bajtów dla flagi -a )
Wypróbuj tutaj!
źródło
-p
flagi.say$F[0]+$F[1]
,say pop()+pop
prace (testowane z truskawek 5.20.2-E
) i oszczędza bajt.Fuzzy Octo Guacamole , 1 bajt
Funkcja, która pobiera dane wejściowe z góry stosu i dane wyjściowe poprzez wypychanie do stosu.
Przykład działający w REPL:
źródło
Partia,
251816 bajtówEdycja: zapisałem
79 bajtów, używając mojej sztuczki z Sekwencji Znaków Zmiennych .źródło
PowerShell v2 +, 17 bajtów
Pobiera dane wejściowe jako dwa osobne argumenty wiersza polecenia, które są wstępnie wypełniane w specjalnej tablicy
$args
. Tworzymy ciąg z-join
operatorem, łącząc je razem ze+
środkiem, a następnie potokujemy ten ciąg doInvoke-Expression
(podobnie doeval
).Dzięki @DarthTwon za przypomnienie mi, że w przypadku tak minimalnych programów istnieje wiele metod pobierania danych wejściowych przy tej samej liczbie bajtów.
PowerShell jest niczym, jeśli nie elastyczny.
źródło
$args[0]+$args[1]
param($a,$b)$a+$b
> <> ,
763 bajtówTłumacz online
Lub spróbuj na TIO z flagą -v.
Wypróbuj online
źródło
+
: wyskoczyłoby dwie liczby ze stosu i odłożyłoby wynik ich dodania z powrotem na stos.-v
Można również uniknąć kosztu , ponieważ odczytanie numerów można było wykonać wcześniej przy wywołaniu funkcji.C, 35 bajtów
To, co zrobiłem tutaj, to zdefiniowane dodawanie bez użycia operatorów logicznych lub arytmetycznych. To rekurencyjnie czyni x sumę bitów przez „xor”, a y bity przenoszenia przez „i”, dopóki nie będzie przeniesienia. Oto wersja bez golfa:
źródło
MATLAB, 4 bajty
1 bajt usunięty dzięki @LeakyNun
Jest to anonimowa funkcja, która pobiera tablicę i podaje sumę. Przykładowe zastosowanie:
źródło
sum
?@sum
poprawna odpowiedź. A może istnieje inny meta konsensus?GoLScript , 1 bajt (nie konkuruje)
Dodaje 2 najlepsze liczby ze stosu. Otóż to.
Teraz, jak wcisnąć je na stos, nie mam pojęcia. Nie sądzę, że to możliwe .. kaszel @ kaszel @ CᴏɴᴏʀO'Bʀɪᴇɴ
źródło
Explanation soon to be coming.
- Riker, 3 lipca 16Język programowania Szekspira (SPL),
137135 bajtówKompletny program, gra w golfa:
I krótkie wyjaśnienie:
Nie jestem do końca pewien, czy jest to najkrótszy możliwy czas. Sprawdź oficjalną stronę, aby uzyskać więcej informacji.
Edycja 1: Usunięto
:
późniejAct I
iScene I
wydaje się, że wszystko po rzymskiej cyfrze jest ignorowane, co oszczędza 2 bajty.źródło
kod maszynowy x86_32, 2 bajty
Zakładając, że dwie wartości znajdują się już w rejestrach ecx i eax, wykonanie instrukcji add spowoduje dodanie wartości dwóch rejestrów i zapisanie wyniku w rejestrze docelowym.
Możesz zobaczyć pełny program napisany w C i wbudowany tutaj . Napisanie opakowania w C ułatwia wprowadzanie danych wejściowych i przeprowadzanie testów, ale faktyczną funkcję dodawania można zredukować do tych dwóch bajtów.
źródło
ret
instrukcji (jeden bajt). I to przy założeniu niestandardowej konwencji wywoływania, w którejeax
jest używany jako rejestr przechodzący arg. (Biblioteka nauczania asm Irvine32 to robi, ale nie robią tego żadne standardowe konwencje wywoływania dla x86-32 lub x86-64, w przeciwieństwie do ARM, gdzie rejestr wartości zwracanejr0
jest również pierwszym rejestrem przekazującym argument.) Niestandardowe konwencje wywoływania są odpowiednie funkcje asm jednak nie trzeba zmieniać na 3 bajtylea (%ecx, %edx), %eax
+ 1 bajtret
dla Microsoft__fastcall
lub gcc-mregparm
.pop
ma tylko 1 bajt, aleesp
tryby adresowania względnego wymagają bajtu SIB. Tak więc konwencja wywoływania wywołującego możepop %ecx
(adres zwrotny),pop %eax
/pop %edx
/add %edx, %eax
(2 bajty) /jmp *%ecx
(2 bajty) = łącznie 7 bajtów. vs.mov 4(%esp), %eax
(4B) /add 8(%esp), %eax
(4B) /ret
= 9 bajtów lub 11 bajtów dla wersji wywołującej wywołującej to użycieret imm16
, jeśli zrobiłem to dobrze. Jest to dodatkowy 1 bajt dla SIB z ESP jako bazą i dodatkowy 1 bajt dla disp8 w każdej insn.