This is an implementation of Huffman decoding with assembly langauges
ํํ๋ง ๋์ฝ๋ฉ์ ์ํด ๋จผ์ ranktable์ ์์ฑํ๊ณ register์ ์ฉ๋๋ฅผ ๊ณ ์ ํ ์ดํ ๋ค์ด์ค๋ input์ ์์ฐจ์ ์ผ๋ก ์ฝ์ด์ต๋๋ค. Input์ ์์ฐจ์ ์ผ๋ก ์ฝ์ด์ค๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๊ณ output์ ํ๋์ฉ ์ ์ฅํ ์ดํ ์ด๋ฅผ *outp์ ์ ์ฅํ๋ ์ ์ฐจ๋ก ์งํํ์ต๋๋ค.
๊ฐ์ฅ ๋จผ์ a0, a1, a2, a3, a4, a5 register ๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ธ์๋ก ๋ค์ด์ค๋ a0, a1, a2, a3 ๋ฅผ ์คํ์ ์ ์ฅ์์ผ ๋์์ต๋๋ค. ๋ค์์ rank table ์ ๋ง๋ค์ด์ผ ํ๋๋ฐ 0๋ถํฐ 7 ์์๊ฐ ์๋ 8 -15 ์์์ธ ์ซ์๋ฅผ ์ฐพ๊ธฐ ์ํด์ 0 7 ์์์ ์๋ ์ซ์๊ฐ ๋ฑ์ฅํ๋ฉด ์คํ์ ์ ํด์ง ์์น์ 1 ์ ์ถ๊ฐํ๋ ํ์์ผ๋ก ๊ตฌํ์ ํ์ต๋๋ค. 72(sp)์๋ 0 ๊ณผ 1 ์ ์ซ์ 64(sp) ์๋ 2์ 3์ ์ซ์, 56(sp) ์๋ 4 ์ 5 ์ ์ซ์ โฆ 16(sp) ์๋ 14 ์ 15 ์ ์ซ์์ ์๋ฆฌ์ ํ์๊ฐ ๋ค์ด๊ฐ๊ฒ ํ์ต๋๋ค. ์ฆ 72(sp)์ ์ซ์๊ฐ 0x11์ด๋ผ๋ฉด 0 - 7 rank์ 0๊ณผ 1์ด ๋ชจ๋ ๋ฑ์ฅํ๋ ๊ฒ์ด๊ณ 0x10 ์ด๋ผ๋ฉด 0๋ง ๋ฑ์ฅํ๋ ๊ฒ์ด๋ฉฐ 0x01 ์ด๋ผ๋ฉด 1 ๋ง ๋ฑ์ฅํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ ๊ฒ 0 - 7 ranktable ์ ์ฌ์ฉ๋๋ ์ซ์๋ค์ ๋ค 1 ๋ก ํ์ํ ์ดํ ์คํ์ ์ง์ ๋ ๋ถ๋ถ์ ๋๋ฉด์ 0 ์ธ ๋ถ๋ถ์ ์ฐพ ์ 8 - 15 ์ธ ranktable ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค ๊ฐ๊ฐ์ ์คํ์ ๋๋ฉด์ ์ง์ ๋ ์คํ์ ์ซ์๊ฐ 0 x 11, 0 x 10, 0 x 01 ์ธ ๊ฒฝ์ฐ๋ก ๋๋์ด a 1 register ์ rank ์ 8~15 ์ธ ์ซ์๋ค์ ์ ์ด์ฃผ๊ฒ ๋ฉ๋๋ค. ์ดํ ์์ฑ๋ 8-15 rank ์ ์ซ์๋ค์ 4(sp) ์คํ์ store ํด์ค๋๋ค. 0-7 rank์ ์ซ์๋ค์ 0(sp) ์ ์ ์ฅํด๋์์ต๋๋ค.
4 byte๋ ranktable๋ก ๋ฌด์กฐ๊ฑด ๋ค์ด์ค๊ฒ ๋๋ ๊ฒ์ด๊ณ ์ดํ ๋ค์ด์ค๋ byte๊ฐ 4byte๋ฅผ ๋๋์ง ํ๋จํ๋ ์ ์ฐจ๋ฅผ ๊ฑฐ์นฉ๋๋ค. 4byte๋ฅผ ๋๋๋ค๋ฉด ์ฐ์ ์ฒซ byte์ ๊ธธ์ด๋ padding bit์ ์ ์ธํ๋ฉด 28bit๊ฐ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฝ๋๋ถ๋ถ์์ keepgoing์ด๋ผ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌํํ์์ต๋๋ค. ํ์ง๋ง 4byte๋ฅผ ๋์ง ์๋๋ค๋ฉด paddingbit์ ๊ณ ๋ คํ์ฌ length๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ฒ์์ inbyte์ ๊ธธ์ด๋ฅผ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๋์ด ๊ณ์ฐํ์์ต๋๋ค.
์ด์ ๋ถํฐ ํน์ register๋ฅผ ํน์ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๊ณ ํน์ ์คํ์ ์์น๋ฅผ ํน์ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
- a1: a1์ register๋ output์ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋๋ฐ 32bit๊ฐ ์ฑ์์ง๊ฒ ๋๋ฉด ์ด๋ฅผ ์ง์ ๋ *outp ์ ์ ์ฅํ๊ณ a1์ ๋ค์ 0์ผ๋ก ์ด๊ธฐํ๋ฅผ ์ํต๋๋ค.
- a0: a0 register๋ ์ง๊ธ ํ์ฌ ์ํฉ์ keep trackํ๊ธฐ ์ํด์ ์ฌ์ฉํฉ๋๋ค. a0 register์ ๋ง์ง๋ง 4 bit์ ํ์ฌ output์ด store๋ ๊ฒ์ด ๋ช๊ฐ์ธ์ง ์ถ์ ํฉ๋๋ค. ๋ง์ฝ ๋ง์ง๋ง 4bit์ด 5๋ผ๋ฉด output์ด 5X4=20 bit๋งํผ ์ ์ฅ๋์ด์๋๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ง์ง๋ง 4bit์ด 8์ด ๋๋ฉด ๊ทธ๊ฒ์ outp ํน์ ์ฅ์์ ์ ์ฅํ๊ณ ์ด๊ธฐํํ๋ ์์ ์ด ํ์ํฉ๋๋ค.
- a5 register๋ ํ์ฌ bit์ ์ํฉ์ ์ ์ฅํฉ๋๋ค.
- a0์ upper bits๋ a5 register์ bit๊ฐ ๋ช ๊ฐ ๋จ์๋๊ฐ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- a5์ ๊ธธ์ด๋ 32bit์ผ๋ก ์์ํ์ฌ bit๋ฅผ 3๊ฐ, 4๊ฐ, 5๊ฐ์ฉ ์ฝ์์ ๋ฐ๋ผ ๊ธธ์ด๊ฐ ์ค์ด๋ค๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ 31๋งํผ a5๋ฅผ shiftํ์ ๋ 0์ด๋ฉด threebit์ผ๋ก ๊ฐ์ ์ฝ๊ณ , 30๋งํผ shiftํ์ ๋ 2์ด๋ฉด fourbit์ผ๋ก ๊ฐ์ ์ฝ๊ณ , 3์ด๋ฉด fivebit์ผ๋ก ๊ฐ์ ์ฝ๊ฒ ๋ฉ๋๋ค.
- 112(sp)๋ ํ์ฌ ๋จ์ inbytes๋ฅผ ์ ์ฅํ๋๋ฐ ๋ง์ฝ ๋ค์ input์ด a5์ ๋ชจ๋ ์ฌ๋ผ๊ฐ์๋๋ฅผ ๊ธฐ์ค์ผ๋ก -4์ฉ ๊ฐ์ํ์ฌ ์๋กญ๊ฒ storeํด์ค๋๋ค.
- 28(sp)์ ๊ฒฝ์ฐ ๋ค์ ๋ค์ด์์ผ ํ input์ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉํฉ๋๋ค.
- 20(sp)๋ ๋ค์ input์ ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉํฉ๋๋ค.
Threebit์ผ ๊ฒฝ์ฐ a0๋ฅผ 48(163)๋งํผ ๊ฐ์์ํค๊ณ fourbit์ ๊ฒฝ์ฐ 164 ๋งํผ, fivebit์ ๊ฒฝ์ฐ 16*5๋งํผ ๊ฐ์์ํค๋๋ฐ ๊ฐ์ํจ์ ๋ฐ๋ผ a0์ upperbit์ด ์์๊ฐ ๋๊ฒ ๋๋ฉด ๋ค์ input์ loadํด์์ผ ํ๋ ์ํฉ์์ผ๋ก next์ ์ํฉ์ผ๋ก ๊ฐ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ๋ ์ด์ ์ฝ์ด์ฌ bit์ด ์์๊ฒฝ์ฐ์๋ input์ ๋ง์ง๋ง ๋ถ๋ถ์ด๋ผ๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ paddingbit ๋ถ๋ถ์ผ๋ก ๊ฐ์ ์ถ๊ฐ์ ์ธ ์กฐ์ ์ ํด์ค๋๋ค. ๋ค์ input์ ์ฝ์ด์ค๋ ๊ณผ์ ์ด ๋ณต์กํ๋ฐ ๋ง์ฝ 20(sp) ๋ถ๋ถ์ด 0์ด๋ผ๋ฉด ์๋ก์ด input stream์ ์ฝ์ด์์ผ ํ๋ค๋ ๋ป์ด๋ฏ๋ก loadnext๋ก ๊ฐ์ ์๋ก์ด input stream์ ์ฝ์ต๋๋ค. ํ์ง๋ง 20(sp) ๋ถ๋ถ์ด 0์ด ์๋๋ผ๋ฉด ์ด๋ฏธ ๋ค์ด์ฌ input stream์ด ์๋ค๋ ๋ป์ด๋ฏ๋ก ์๋ก์ด ๊ฒ์ loadํ์ง ์์ต๋๋ค. ๊ทธ๋์ nottotal ๋ถ๋ถ์ผ๋ก ๊ฐ๋๋ฐ ์ฌ๊ธฐ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋๊ฒ ๋ฉ๋๋ค. a5์ ์๋ก์ด byte๋ฅผ loadํ ์ดํ์๋ ์ ์ฅ๋์ด์๋ input stream์ด ๋ค ๋ค์ด๊ฐ์ง ์์ ๊ฒฝ์ฐ๊ฐ ์๊ณ ๋ชจ๋ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ๋ชจ๋ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ์๋ ifcase๋ก ๊ฐ์ ํน๋ณํ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋๋ค. 3 bit, 4 bit, 5 bit์ฉ ์ฝ์ด ๊ฐ๊ฐ์ ํด๋นํ๋ ranktable๊ณผ ๋งค์น์์ผ output stream์ ํ๋์ฉ ์ ์ฅ์ ํด์ค๋๋ค. 32bit๊ฐ ์ฑ์์ง๊ฒ ๋๋ฉด outbytes์ ์๋ 4์ฉ ๊ฐ์์ํต๋๋ค. ์ด๋ ์ฝ๋ฉ๋ outbytes๊ฐ ์ ํด์ง outbytes์ ์๋ฅผ ๋์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ง์ฝ outbytes์ ์๊ฐ 0๋ณด๋ค ์์์ง๊ฒ ๋๋ค๋ฉด storeํ๋ ๊ฒ์ ๋ฉ์ถ๊ณ return์ ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
