#include <stdio.h>
#define SYS_READ 3
#define STDIN_FILENO 0
char buff[100]; /* Declare a buff to hold the returned string. */
int main()
{
ssize_t charsread; /* The number of characters returned. */
/* Use constraints to move buffer size into edx, stdin handle number
into ebx, address of buff into ecx. Also, "0" means this value
goes into the same place as parameter 0 (charsread). So eax will
hold SYS_READ (3) on input, and charsread on output. Lastly, you
MUST use the "memory" clobber since you are changing the contents
of buff without any of the constraints saying that you are.
This is a much better approach than doing the "mov" statements
inside the asm. For one thing, since gcc will be moving the
values into the registers, it can RE-USE them if you make a
second call to read more chars. */
asm volatile("int $0x80" /* Call the syscall interrupt. */
:
: "a" (SYS_READ), "b" (STDIN_FILENO), "c" (buff), "d" (sizeof(buff))
: "memory", "cc");
printf("%d: %s", (int)charsread
, buff
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFNZU19SRUFEIDMKI2RlZmluZSBTVERJTl9GSUxFTk8gMApjaGFyIGJ1ZmZbMTAwXTsgLyogRGVjbGFyZSBhIGJ1ZmYgdG8gaG9sZCB0aGUgcmV0dXJuZWQgc3RyaW5nLiAqLwppbnQgbWFpbigpCnsKICAgCiAgIHNzaXplX3QgY2hhcnNyZWFkOyAvKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQuICovCgogICAvKiBVc2UgY29uc3RyYWludHMgdG8gbW92ZSBidWZmZXIgc2l6ZSBpbnRvIGVkeCwgc3RkaW4gaGFuZGxlIG51bWJlcgogICAgICBpbnRvIGVieCwgYWRkcmVzcyBvZiBidWZmIGludG8gZWN4LiAgQWxzbywgIjAiIG1lYW5zIHRoaXMgdmFsdWUKICAgICAgZ29lcyBpbnRvIHRoZSBzYW1lIHBsYWNlIGFzIHBhcmFtZXRlciAwIChjaGFyc3JlYWQpLiAgU28gZWF4IHdpbGwKICAgICAgaG9sZCBTWVNfUkVBRCAoMykgb24gaW5wdXQsIGFuZCBjaGFyc3JlYWQgb24gb3V0cHV0LiAgTGFzdGx5LCB5b3UKICAgICAgTVVTVCB1c2UgdGhlICJtZW1vcnkiIGNsb2JiZXIgc2luY2UgeW91IGFyZSBjaGFuZ2luZyB0aGUgY29udGVudHMKICAgICAgb2YgYnVmZiB3aXRob3V0IGFueSBvZiB0aGUgY29uc3RyYWludHMgc2F5aW5nIHRoYXQgeW91IGFyZS4KCiAgICAgIFRoaXMgaXMgYSBtdWNoIGJldHRlciBhcHByb2FjaCB0aGFuIGRvaW5nIHRoZSAibW92IiBzdGF0ZW1lbnRzCiAgICAgIGluc2lkZSB0aGUgYXNtLiAgRm9yIG9uZSB0aGluZywgc2luY2UgZ2NjIHdpbGwgYmUgbW92aW5nIHRoZSAKICAgICAgdmFsdWVzIGludG8gdGhlIHJlZ2lzdGVycywgaXQgY2FuIFJFLVVTRSB0aGVtIGlmIHlvdSBtYWtlIGEgCiAgICAgIHNlY29uZCBjYWxsIHRvIHJlYWQgbW9yZSBjaGFycy4gKi8KCiAgIGFzbSB2b2xhdGlsZSgiaW50ICQweDgwIiAvKiBDYWxsIHRoZSBzeXNjYWxsIGludGVycnVwdC4gKi8KICAgICAgOiAKICAgICAgOiAiYSIgKFNZU19SRUFEKSwgImIiIChTVERJTl9GSUxFTk8pLCAiYyIgKGJ1ZmYpLCAiZCIgKHNpemVvZihidWZmKSkKICAgICAgOiAibWVtb3J5IiwgImNjIik7CgogICAgcHJpbnRmKCIlZDogJXMiLCAoaW50KWNoYXJzcmVhZCwgYnVmZik7CgogICAgcmV0dXJuIDA7Cn0=