6 ms·
Echo – Assembly program that prints the first positional argument to stdout
- tlholaday 10y agoecho returns nonzero if it cannot write ... touch foo.txt; chmod 400 foo.txt; echo ouch > foo.txt; echo $? .., but it appears this asm returns zero always.
- tomjakubowski 10y agoHow do "raw" system calls pass back error information on Linux? errno is strictly a C/POSIX abstraction, right?
- dom0 10y agoThey just return the negative error number. Eg. -EINVAL.
- JoshTriplett 10y agoAnd for syscalls that also have a meaningful return value, the ABI requires that valid errno values fall in the range -1 to -4095, to disambiguate them from any possible return value. Those values can't conflict with valid userspace pointers (since they'd point into kernel space), and syscalls must not allow them to conflict with valid numeric return values.
- userbinator 10y ago...which I think is a far superior system to errno. I commented on this before somewhat recently: https://news.ycombinator.com/item?id=13062421 https://news.ycombinator.com/item?id=13062421 In fact, it's puzzling to me why the errno mechanism was even conceived, as it seems to offer no advantages over returning errors directly (does anyone happen to know?)
- bdcravens 10y agoI'm curious as to the why. Kubernetes doesn't keep Kelsey busy enough? :-)
- mistaken 10y agoI guess it's because the echo command included in the shell was slow.
- pm215 10y agoThe cost of fork+exec of a separate binary will make even the most efficient possible external echo slower than the shell builtin, I suspect. (This is why echo is a builtin in the first place, though there's no requirement for it to be so.)
- burke 10y agoBased on his twitter it looks like it was just an interesting thing to learn over the holidays or as a 2017 thing.
- jkmcf 10y agoKelsey exists purely to make the rest of us feel lazy :)
- wfunction 10y agoDoesn't echo print all the arguments?
- eriknstr 10y agoIndeed it should.
- kelseyhightower 10y agoIt will as I continue to work on echo until it's "finished". This is the result of 4 hours of learning and writing my first assembly program.
- andreiw 10y agoNow rewrite in IR =))
- aiur3la 10y agoSerious question: why is this on HN front page? Am I missing something?
- pavlov 10y agoI feel it's kind of interesting as a minimal Unix program that does something useful without linking to the C library, just with syscalls. Even for echo, this one is extremely minimalist: first argument only, and a maximum of 255 characters.
- gens 10y agoI don't understand why it is limited to 255 chars. The kernel copies the string(s) into the programs memory so it would be a kernel bug if the program got a non null-terminated or too long string. More importantly this program has a bug in that it doesn't check if there is an argument passed to it at all. Good effort but can improve a lot. I would praise the documentation but it is rather imprecise. All in all i wouldn't put it on the front page of HN yet.
- pavlov 10y agoMaybe the 255-char limit is a feature? If this "fast echo" is meant to be used in a script that writes entries to a log where you wouldn't want long text anyway, or something like that... So having a known upper bound for the output size can be useful.
- deleted 10y ago[deleted]
- cyphar 10y ago> I don't understand why it is limited to 255 chars. The kernel copies the string(s) into the programs memory so it would be a kernel bug if the program got a non null-terminated or too long string. But you can also pass arguments to execve(2) which are not null-terminated.
- whym 10y agoThe source code includes this notice: "Copyright 2017 Google Inc. All Rights Reserved." I wonder if the couple of dozens of lines of assembly code could be trivial enough to be public domain. Assuming a straightforward implementation, surely there is far less freedom in expressing the simplest version of the echo program in ASM compared to, say, C?
- exDM69 10y agoI'm guessing that the author wants to be sure not to get in trouble with their legal department. My contract has a similar clause (all copyright assigned to employer) but it's void because my local (non-US) legislation overrides it. Not that I want to go head to head with our legal dept to test whether it holds.
- userbinator 10y agosurely there is far less freedom in expressing the simplest version of the echo program in ASM compared to, say, C? I'd say it's the opposite, since it is often the case that more instructions (and thus ways to select and arrange them) are required to express an operation in Asm compared to an HLL like C. This implies that there is room for more creativity when e.g. writing a "Hello world" in Asm vs. C.
- jamesfisher 10y agoThe instruction `repne scasb`[1] stood out. `repne X` means "while (not equal) { X; }". How is `repne` implemented? Is `repne scasb` assembly shorthand for a `scasb` then a `jne`? Or is `repne` some fancy higher-order instruction which takes another instruction as its argument? [1]: https://github.com/kelseyhightower/echo/blob/53d84ea4e79db3dbe27688b5d45d839854851a57/echo.asm#L32 https://github.com/kelseyhightower/echo/blob/53d84ea4e79db3d...
- Stratoscope 10y agoThe latter. The various REPxx prefixes cause a string instruction like SCASB to be repeated until some condition is satisfied. These date back all the way to the 8086/8088. They were the fastest way to do string operations on those early CPUs, but I don't think this the case on modern CPUs. https://www.google.com/search?q=intel+rep+prefix https://www.google.com/search?q=intel+rep+prefix http://wiki.osdev.org/X86-64_Instruction_Encoding#REPNE.2FREPNZ.2C_REP_and_REPE.2FREPZ_prefixes http://wiki.osdev.org/X86-64_Instruction_Encoding#REPNE.2FRE... https://courses.engr.illinois.edu/ece390/archive/spr2002/books/labmanual/inst-ref-scasb.html https://courses.engr.illinois.edu/ece390/archive/spr2002/boo...
- tptacek 10y agoThey're still the x86-64 implementation for things like strlen on a bunch of platforms. They're not always the fastest, but have code size advantages. http://agner.org/optimize/optimizing_assembly.pdf http://agner.org/optimize/optimizing_assembly.pdf
- Stratoscope 10y agoThat's a really interesting document - I am going to spend some time studying it, thanks! Good point about the code size. I imagine there are likely to be cases where that would let some algorithm run faster overall because it fits in the instruction cache, even if the string operation considered on its own is slower.
- pvitz 10y ago
- __michaelg 10y agoIt looks like Kelsey didn't write a lot of assembly before. There are quite a few things you either wouldn't do -- like `cld` for no reason -- or most people (and compilers) would do otherwise -- e.g., `xor ebx, ebx` instead of `mov ebx, 0`. Besides, 32 bit (⊙_⊙')
- kelseyhightower 10y agoYes, this is my first assembly program. I had to look up every instruction and it took me hours to understand even the basics, but it was worth it. I have a much better understanding of x86 assembly and plan to write larger programs to continue learning in 2017. I went with 32 bit because all the examples were 64 bit so I forced to learn the nasm and ld flags to get my program to compile, link, and run. I also learned a lot about the different registers available to 32 and 64 bit programs.
- userbinator 10y agoWhat caught my attention was the segment register use --- besides the fact that Linux runs processes in flat mode, the more common way to es = ds is push ds; pop es. That said, it does look better than compiler output and distinctly has the style of hand-written Asm; the 3 pops at the beginning, for example, would be something no compiler I've seen can do. (Minor "optimisation" --- rethinking your register use can eliminate some superfluous moves.)