概要
中古ノート買ってみた。
wsl1のubuntu18.04にnasm入れてみた。
練習問題、やってみた。
練習問題
湯婆婆を実装せよ。
実行結果
# gcc -o yuba yuba.s -no-pie
# ./yuba
契約書だよ。そこに名前を書きな。原美恵子
フン。原美恵子というのかい。贅沢な名だねぇ。今からお前の名前は美だ。いいかい、美だよ。分かったら返事をするんだ、美!!
# ./yuba
契約書だよ。そこに名前を書きな。原美恵子
フン。原美恵子というのかい。贅沢な名だねぇ。今からお前の名前は美だ。いいかい、美だよ。分かったら返事をするんだ、美!!
# ./yuba
契約書だよ。そこに名前を書きな。原美恵子
フン。原美恵子というのかい。贅沢な名だねぇ。今からお前の名前は美だ。いいかい、美だよ。分かったら返事をするんだ、美!!
# ./yuba
契約書だよ。そこに名前を書きな。原美恵子
フン。原美恵子というのかい。贅沢な名だねぇ。今からお前の名前は美だ。いいかい、美だよ。分かったら返事をするんだ、美!!
# ./yuba
契約書だよ。そこに名前を書きな。原美恵子
フン。原美恵子というのかい。贅沢な名だねぇ。今からお前の名前は美だ。いいかい、美だよ。分かったら返事をするんだ、美!!
# ./yuba
契約書だよ。そこに名前を書きな。原美恵子
フン。原美恵子というのかい。贅沢な名だねぇ。今からお前の名前は原だ。いいかい、原だよ。分かったら返事をするんだ、原!!
サンプルコード
.intel_syntax noprefix
.global main
.text
main:
push rbp
mov rbp, rsp
_start:
mov r15, 0
mov r14, 0
mov r13, 0
_keiyaku:
mov rdi, OFFSET FLAT:keiyaku
mov rax, 0
call printf
_get_random_one_word:
mov rsi, OFFSET FLAT:buff
mov rdi, OFFSET FLAT:fmt
mov rax, 0
call scanf
lea r15, buff[rip]
lea r14, name[rip]
rdtsc
mov rdx, 0
mov rcx, 3
div rcx
cmp rdx, 2
jz _pass
inc r15
inc r15
_pass:
mov r13d, [r15]
mov [r14], r13d
_fun:
mov rdi, OFFSET FLAT:fun
mov rax, 0
call printf
_namae:
mov rdi, OFFSET FLAT:buff
mov rdx, r14
call printf
_zeitaku:
mov rdi, OFFSET FLAT:zeitaku
mov rax, 0
call printf
_imakara:
mov rdi, OFFSET FLAT:imakara
mov rax, 0
call printf
call _print_new_name
_iikai:
mov rdi, OFFSET FLAT:iikai
mov rax, 0
call printf
call _print_new_name
_henji:
mov rdi, OFFSET FLAT:henji
mov rax, 0
call printf
call _print_new_name
mov rdi, OFFSET FLAT:bikkuri
mov rax, 0
call printf
jmp _end
_print_new_name:
mov rdi, OFFSET FLAT:name
mov rax, 0
call printf
ret
_end:
mov eax, 0
leave
ret
.data
fmt: .string "%s"
keiyaku: .string "契約書だよ。そこに名前を書きな。"
fun: .string "フン。"
zeitaku: .string "というのかい。贅沢な名だねぇ。"
imakara: .string "今からお前の名前は"
iikai: .string "だ。いいかい、"
henji: .string "だよ。分かったら返事をするんだ、"
bikkuri: .string "!!"
.bss
.comm buff, 64
.comm name, 3
以上。