2021-03-01から1ヶ月間の記事一覧

NASM入門 puts

global main extern puts section .text main: mov rdi, message call puts wrt ..plt ret message: db "hola", 0 nasm -felf64 hola.asm gcc -o hola hola.o

NASM入門 Hello,World

global _start section .text _start: mov rax, 1 ;システムコールをwriteに設定 mov rdi, 1 ;出力先をstdoutに設定 mov rsi, message ;出力する文字列の先頭アドレスを設定 mov rdx, 13 ;出力する文字列のバイト数を設定 syscall ;システムコールを実行 mov…

低レイヤを知りたい人のためのCコンパイラ作成入門(ステップ2)

www.sigbus.info .intel_syntax noprefix .globl main main: mov rax, 5 add rax, 20 sub rax, 4 ret$ cc -g -o tmp tmp.s $ gdb ./tmp(gdb) b main Breakpoint 1 at 0x1125: file tmp.s, line 4. (gdb) r Starting program: Breakpoint 1, main () at tmp.s…

Rust入門 コマンドライン引数を取得して数値に変換する

from_str関数はu64型を返すのではなく、パースが成功したかどうかを表すResult型を返す。 成功した場合には、Ok(v)を返す。vが生成したu64型のデータ 失敗した場合には、Err(e)を返す。eはエラーの理由を説明するエラー値 Resultのexpectメソッドが値vを返す…

Rust入門 コマンドライン引数の取得

fn main() { let args_string: Vec<String> = std::env::args().skip(1).collect(); println!("{:?}", args_string); for a in args_string { println!("{},{}", a, a.len()); } } 実行結果 $ ./args a bc 123 ["a", "bc", "123"] a,1 bc,2 123,3</string>

Rust入門 ベクタ イテレータ fold

ベクタはサイズを変更できる配列である。vec!マクロで生成できる。 ベクタの各要素の合計を求めるプログラム fn main() { let mut v = vec![1,2,3,4,5]; println!("{:?}", v); println!("{}", v.iter().fold(0, |a, b| a + b)); v.push(6); println!("{:?}",…

Rust入門 エラトステネスのふるい

エラトステネスのふるいで、30より小さい素数を表示するプログラム 配列sieveに30個のtrueを入れて、jが素数でなければsieve[j]をfalseにする。 fn main() { let mut sieve = [true; 30]; sieve[0] = false; sieve[1] = false; for i in 2..6 { if sieve[i] …

テキストエディタを作っています(1)

勉強のためにCでcursesライブラリを使ってシンプルなテキストエディタを作っています。入力できる文字は半角英数文字(アスキーコード32から126)と改行(LF,アスキーコード10) できたもの テキストデータを入れる双方向リストを作り、リストにノード(1文字のデ…

Cでcursesライブラリを使う

準備 sudo apt install libncurses-devキーボードからの入力を受け取って、その内容を画面に表示するプログラム #include <curses.h> int main(void) { char buf[1024]; initscr(); /* 端末の初期化 */ noecho(); /* echoをオフにする */ getnstr(buf, sizeof(buf)); /</curses.h>…

NHK高校講座の世界史の「オリエント文明」を見て興味を持ったものをネットで検索した

www.nhk.or.jp ホモ・サピエンス ホモ・サピエンスは20万年前から10万年前にかけておもにアフリカで現生人類へ進化したのち、6万年前にアフリカを離れて長い歳月を経て世界各地へ広がった。 ホモ・サピエンス - Wikipedia 楔形文字 楔形文字(くさびがたもじ…

UNIXシステムコール 標準入力から読んでECHOせずに標準出力に表示する

ECHOするプログラム #include <stdio.h> int main(void) { int c; while ((c = getchar()) != EOF) { putchar(c); } } ECHOしないプログラム #include <stdio.h> #include <termios.h> #include <unistd.h> int main(void) { int c; struct termios new, old; tcgetattr(STDIN_FILENO, &old); /* 現</unistd.h></termios.h></stdio.h></stdio.h>…

Linuxターミナルのショートカットキー

ターミナルを起動する Ctrl + Alt + T ターミナルを終了する (入力欄に何も入力されていない状態で) Ctrl + Dカーソルの移動 右に1つ移動 Ctrl + F 左に1つ移動 Ctrl + B 行頭に移動 Ctrl + A 行末に移動 Ctrl + Eカーソルの左側の1文字を削除する Ctrl + …

何かを理解しているとはそれについて高い確率で正解を作り続けることができることだ

俳句を理解しているとは、高い確率でいい俳句を作り続けることができることだ。 数学を理解しているとは、高い確率で正解を作り続けることができることだ。俳句を理解しているとはどういうことだろうか。 ランダムに17個のひらがなを並べるコンピュータの…

catコマンドでファイルに^C(アスキーコード3の文字)を書く方法

^CはCtrl + C を押したときに入力されるアスキーコード3の文字のこと % cat > fooを実行して、Ctrl + Cを押すとSIGINTが送信されてコマンドが終了してしまい、^Cをファイルに書くことができない。 % cat > fooを実行して、Ctrl + Vを押し、Ctrl + Cを押し、C…

UNIXシステムコール 高水準入出力(getc,putchar) ファイルから読んで画面に表示する

#include <stdio.h> #include <stdlib.h> #define INFILE "abc.txt" int main(void) { FILE *fp; int c; if ((fp = fopen(INFILE, "r")) == NULL) { perror("fopen"); exit(1); } while ((c = getc(fp)) != EOF) { putchar(c); } if ((fclose(fp)) == EOF) { perror("fclose"); </stdlib.h></stdio.h>…

UNIXシステムコール 標準出力が行緩衝であることを確認する

標準出力は改行が書き込まれるまで出力しない。これを行緩衝という。 下記のプログラムを実行すると、「54321 go!」という文字列が同時に表示される。 改行が書き込まれるまで出力は行われず、バッファに蓄積されるからである。 #include <stdio.h> #include <unistd.h> int mai</unistd.h></stdio.h>…