{"id":16012935,"url":"https://github.com/bootjp/hello_assembly_world","last_synced_at":"2026-06-24T09:34:07.176Z","repository":{"id":84492074,"uuid":"115853561","full_name":"bootjp/hello_assembly_world","owner":"bootjp","description":null,"archived":false,"fork":false,"pushed_at":"2018-07-22T07:05:55.000Z","size":13,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-03T23:28:13.846Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bootjp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-31T09:06:50.000Z","updated_at":"2018-07-22T07:05:57.000Z","dependencies_parsed_at":"2023-03-02T20:30:25.117Z","dependency_job_id":null,"html_url":"https://github.com/bootjp/hello_assembly_world","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootjp%2Fhello_assembly_world","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootjp%2Fhello_assembly_world/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootjp%2Fhello_assembly_world/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootjp%2Fhello_assembly_world/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bootjp","download_url":"https://codeload.github.com/bootjp/hello_assembly_world/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240250354,"owners_count":19771778,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-08T14:22:41.103Z","updated_at":"2026-06-19T05:30:19.693Z","avatar_url":"https://github.com/bootjp.png","language":"Assembly","funding_links":[],"categories":[],"sub_categories":[],"readme":"# assembly study\n\n## nasm\n\n```bash\nbrew install nasm\nnasm -v\n\u003e NASM version 2.13.02 compiled on Nov 30 2017\nnasm -f macho64 -o sample.o  scratch.asm \u0026\u0026 ld -o sample.out sample.o \u0026\u0026 ./sample.out\n```\n\n\n## masm\n\nbase document: http://wisdom.sakura.ne.jp/programming/asm/index.html\n\ncurrent : http://wisdom.sakura.ne.jp/programming/asm/assembly8.html\n\nuse DOSBox\n+ https://www.dosbox.com/\n   \n+ 8086 Assembler\n\n* ToDo  \n  + [ ] DOSBox change keyboard layout \n     + [official documents](https://www.dosbox.com/DOSBoxManual.html#KeyboardLayout)\n     + [question](https://superuser.com/questions/1080381/keyboard-layout-setting-in-dosbox-has-no-effect)\n     + [ ] DOSBox build for high Sierra\n     * japanese keyboard layout = 106\n* dosbox howt to use.\n  ```dos\n  mount c ~/dosbox # ~/doxbosはosx環境上\n  c:\\\n  debug\n  ```\n  \n\n\n## study\n\n### レジスタ\n  * 汎用レジスタ (何に使ってもよい、Ex 変数)\n     + AX アキュムレータ\n     + BX ベースレジ\n     + CX カウントレジスタ (ループなどのカウンタに使いことが多い)\n     + DX データレジスタ\n  * インデックスレジスタ\n     + SI ソースインデックス\n     + DI ディスティネーションインデックス\n  * 特殊レジスタ\n     + BP ベースポインタ\n     + SP スタックポインタ\n     + IP イントラクションポインタ\n  * セグメントレジスタ\n     + CS コードセグメント\n     + DS データセグメント\n     + ES エクストラセグメント\n     + SS スタックセグメント \n     \n### 汎用レジスタについて\n  + 汎用レジスタは16ビットで構成される場合、8ビットを二つ組み合わせている\n  + AXレジスタの実体は8ビットのAHとALレジスタの二つが実体\n    + AHはAXの上位8ビット (High)\n    + ALはAXの上位8ビット (Low)\n  + 同様にBX, CX, DXの汎用レジスタは8ビット毎に分割されている\n    + 不明点: 今は16ビットなので High Lowだけど32, 64だと？\n        + 64ビットでは上位概念としてEAXレジスタがあり、EXレジスターをラップするRAXレジスタというものがあるようだ。\n        + 64ビットではAXレジスタは4つ存在し、AXレジスタを管理する(?)EAXレジスタがあり\n        + EAX レジスタも二つあり、EAXレジスタを管理する(?) RAXレジスタがある\n        + ref: http://www.mztn.org/lxasm64/amd04.html\n\n### 命令形\n  * MOV (レジスタ|メモリ)へのデータ転送\n     + 高級言語でいう代入\n     * 第一オペランドがdest(値を転送される側、保存対象領域を指定する)\n     * 第二オペランドがsource(代入を行う(レジスタ、メモリアドレス、数値))\n     + 非破壊読み取りである。データ代入しても元の領域の値は壊れない（いわゆる参照渡しではない？）\n     * ニーモニックというものの一つに分類される(?)\n\n### リトルエンディアン\n\n```\n-A 100 103\n    MOV AX, 1234\n    \n-G=100 103\n\nAX=1234...（略\n```\nこれを逆アセンブルして見てみると\n\n```\n-U 100 103\n073F:0100 B83412 MOV AX, 1234\n073F:0103 0000   ADD [BX+SI],AL\n```\nとなっている8086命令形ではリトル･エンディアンマシンというらしく、\nワードのバイトは下位から順にアドレスが割り当てられる。\n\n注意すべきはバイト毎に割り当てるということであり、単純に `4321` とはならない `3412` となる。\n\n### 8086のアドレスについて\n\n* アセンブリであっても物理アドレスへのアクセスの指定はできない\n* セグメント方式が採用されている\n* セグメントに対してオフセットがある\n  + これらを計算することで物理アドレスを導き出すことができる\n  * これらをセグメントベースという\n  * セグメントベースは16進数の5桁で表されるため0-f * 5 = 1MB\n  * オフセットアドレスは4桁16進数 = 64KB\n  \n### セグメントレジスタ\n * セグメントレジスタはセグメントアドレスを指定するのに用いられる\n * メモリアクセス時コンピュータはセグメントレジスタ経由で参照をする\n * セグメントレジスタは合計4つ存在しそれぞれに専用の役割が存在する(64bitでは?）\n * セグメントレジスタはCS（コード）, DS（データ）, ES（エクストラ), SS（スタック）の4つがあり，CSではコード・レジスタとなる\n * CSレジスタは自分自身のセグメントレジスタを指す\n   - 実行中の機械語を格納しているアドレスである\n   - CPUが機械語を実行する際に使う\n * DSレジスタはデータを格納する専用のセグメントを指す\n * ESレジスタはDSレジスタのようなものでデータ以外にセグメントが必要なときに使う\n * SSレジスタはスタック操作に使用する\n \n\n### アドレッシング\n + メモリとのデータの転送\n   * オフセットアドレス（絶対アドレスではなく相対値）で指定する\n   * オフセットアドレスで指定する場合は `[]` で囲う必要がある\n```\nMOV AX, [0200]\nMOV [0200] , AX\n```\n   * アセンブリでは他の記憶媒体からデータを読み込む際は「ロード」と言う\n   * レジスタからメモリへデータを転送することを「ストア」と言う\n   * ちなみにメモリから他の記録媒体に保存することを「セーブ」と言う\n   * 同一の記録媒体の別アドレスへデータを移すときは「転送」という\n \n   * 以下はメモリとレジスタ間のデータ転送をしている\n```\n-A 100\n073F:0100 MOV AX , 4142\n073F:0103 MOV [0200] , AX\n073F:0106\n-G =100 106\n\nAX=4142  BX=0000  CX=0000  DX=0000  SP=00FD  BP=0000  SI=0000  DI=0000\nDS=073F  ES=073F  SS=073F  CS=073F  IP=0106   NV UP EI PL NZ NA PO NC\n073F:0106 0000          ADD    [BX+SI],AL\n\n-D 200 201\n073F:0200  42 41                                             BA\n```\n   * 以下のように右オペランドにオフセットアドレスを指定することも可能\n```\n073F:0100 MOV AX, 4142\n073F:0103 MOV [0200], AX\n073F:0106 MOV DX, [0200]\n073F:010A\n``` \n\n + 即値のストア\n   * メモリへ即値（レジスタ経由でない）をストアする場合にはデータのサイズ指定が必要である\n      - レジスタのときに必要がないのはレジスタのサイズが決まっていることと\n      - メモリは1バイトでも1ワードでもストア可能なため（ワードってなんだ？）\n   * そこで明示的に指定する方法として `PTR` 演算子を使用する\n   * この演算子はアセンブラにサイズを知らせるためのもの\n     * `SIZE PTR`\n   * SIZEの部分にはBYTEまたはWORDを指定する（32bitではDWORDもある(64bitは？)）\n   * BYTEを指定した場合は1バイト，WORDを指定した場合は2バイト(16bit)を確保する\n   * 構文の仕様はアセンブラによって異なるが，一般的に左辺のオペランドの前に指定する\n     * `MOV BYTE PTR ...` \n   * ほとんどのアセンブラではメモリに即値をストアする場合に指定しなければならない\n```\n-A 100\n073F:0100 MOV BYTE PTR [0200] , 41\n073F:0105 MOV WORD PTR [0300] , 4342\n073F:010B\n```\n```\n-D 200 200\n073F:0200  42 #\u003c= なんかおかしい\n-D 300 301\n073F:0300  00 00 #\u003c= なんかおかしい\n```\n  + アドレッシングモード\n    * データの転送左辺と右辺のオペランドは機械語で一意である必要がある\n      + `MOV AX, FF` と `MOV AX, [0200]`では別物である\n      + アセンブラは左辺と右辺のタイプ（レジスタ|メモリ|即値）で機械語を決めている\n      + つまり以下は成立しない\n    * `MOV [0200], [0300]`\n      + これに対応する機械語が存在しないため実行できない\n      + アセンブラではレジスタ，メモリ，即値のうち転送可能な組み合わせが決まっている\n        - さらにレジスタでも使えるものとそうでないものがある\n    * 転送可能な組み合わせ  \n      + 即値 -\u003e レジスタ\n      + 即値 -\u003e メモリ（オフセット）\n      + メモリ（オフセット） \u003c-\u003e レジスタ\n      + レジスタ \u003c-\u003e セグメントレジスタ\n      + セグメントレジスタ \u003c-\u003e メモリ（オフセット）\n        * フラグレジスタは特殊なレジスタのため一切の転送が行えない\n  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbootjp%2Fhello_assembly_world","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbootjp%2Fhello_assembly_world","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbootjp%2Fhello_assembly_world/lists"}