2021-07-03 05:07:57 +01:00
|
|
|
<!DOCTYPE HTML>
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<meta http-equiv="Content-Type" content="text/html;charset=US-ASCII">
|
2021-12-31 03:21:33 +00:00
|
|
|
<meta name="generator" content="ZealOS V1.08">
|
2021-07-03 05:07:57 +01:00
|
|
|
<style type="text/css">
|
2021-10-08 07:06:11 +01:00
|
|
|
body {background-color:#1f1f1f;}
|
|
|
|
.cF0{color:#e3e3e3;background-color:#1f1f1f;}
|
|
|
|
.cF1{color:#4f84a6;background-color:#1f1f1f;}
|
|
|
|
.cF2{color:#73a255;background-color:#1f1f1f;}
|
|
|
|
.cF3{color:#297582;background-color:#1f1f1f;}
|
|
|
|
.cF4{color:#b34f4b;background-color:#1f1f1f;}
|
|
|
|
.cF5{color:#8a52c3;background-color:#1f1f1f;}
|
|
|
|
.cF6{color:#b7822f;background-color:#1f1f1f;}
|
|
|
|
.cF7{color:#444444;background-color:#1f1f1f;}
|
|
|
|
.cF8{color:#6d6d6d;background-color:#1f1f1f;}
|
|
|
|
.cF9{color:#94bfde;background-color:#1f1f1f;}
|
|
|
|
.cFA{color:#a1ce97;background-color:#1f1f1f;}
|
|
|
|
.cFB{color:#6db4be;background-color:#1f1f1f;}
|
|
|
|
.cFC{color:#e88e88;background-color:#1f1f1f;}
|
|
|
|
.cFD{color:#ca94e8;background-color:#1f1f1f;}
|
|
|
|
.cFE{color:#d4b475;background-color:#1f1f1f;}
|
|
|
|
.cFF{color:#1f1f1f;background-color:#1f1f1f;}
|
2021-07-03 05:07:57 +01:00
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body>
|
2021-07-05 01:12:38 +01:00
|
|
|
<pre style="font-family:monospace;font-size:12pt">
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l1"></a><span class=cF2>/*When Terry Davis was a kid with a Commodore 64,</span><span class=cF0>
|
2021-07-06 03:57:12 +01:00
|
|
|
<a name="l2"></a></span><span class=cF2>the 6502 chip had no multiply instruction</span><span class=cF0>
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l3"></a></span><span class=cF2>and this is how he had to do it, except,</span><span class=cF0>
|
Rename abs_addres to abs_address.
Update documentation/comments to rename addr, fun, var, stmt, blk, desc, reg, seg, ptr, dup, clus, val, and bttn, to address, function, variable, statement, block, description, register, segment, pointer, duplicate, cluster, value, and button, respectively.
2021-10-07 02:35:32 +01:00
|
|
|
<a name="l4"></a></span><span class=cF2>he used more registers in this example.</span><span class=cF0>
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l5"></a></span><span class=cF2>*/</span><span class=cF0>
|
|
|
|
<a name="l6"></a></span><span class=cF1>asm</span><span class=cF0> {
|
|
|
|
<a name="l7"></a></span><span class=cF2>//Opcodes are slightly different to make writing the x86_64 assembler easier.</span><span class=cF0>
|
2021-07-26 20:29:49 +01:00
|
|
|
<a name="l8"></a></span><span class=cF2>//See </span><a href="https://zeal-operating-system.github.io/ZealOS/Compiler/OpCodes.DD.html#l1"><span class=cF4>::/Compiler/OpCodes.DD</span></a><span class=cF2>.</span><span class=cF0>
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l9"></a>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l10"></a></span><span class=cF2>//You can clobber RAX,RBX,RCX,RDX,R8,R9.</span><span class=cF0> </span><span class=cF2>The compiler expects that.</span><span class=cF0>
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l11"></a>
|
|
|
|
<a name="l12"></a>MUL_BY_HAND_U8_U8_TO_U16: </span><span class=cF2>//This is only for fun.</span><span class=cF0>
|
|
|
|
<a name="l13"></a></span><span class=cF2>//8bit * 8bit-->16bit</span><span class=cF0>
|
|
|
|
<a name="l14"></a></span><span class=cF2>//AL*BL-->AX</span><span class=cF0>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l15"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>CL</span><span class=cF0>, </span><span class=cFE>8</span><span class=cF0>
|
|
|
|
<a name="l16"></a> </span><span class=cF1>SHL</span><span class=cF0> </span><span class=cFC>AX</span><span class=cF0>, </span><span class=cFE>8</span><span class=cF0>
|
|
|
|
<a name="l17"></a>@@05: </span><span class=cF1>SHL1</span><span class=cF0> </span><span class=cFC>AX</span><span class=cF0>
|
|
|
|
<a name="l18"></a> </span><span class=cF1>JNC</span><span class=cF0> @@10
|
|
|
|
<a name="l19"></a> </span><span class=cF1>ADD</span><span class=cF0> </span><span class=cFC>AL</span><span class=cF0>, </span><span class=cFC>BL</span><span class=cF0>
|
|
|
|
<a name="l20"></a>@@10: </span><span class=cF1>DEC</span><span class=cF0> </span><span class=cFC>CL</span><span class=cF0>
|
|
|
|
<a name="l21"></a> </span><span class=cF1>JNZ</span><span class=cF0> @@05
|
|
|
|
<a name="l22"></a> </span><span class=cF1>RET</span><span class=cF0>
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l23"></a>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l24"></a>_MUL_BY_HAND_U8_U8_TO_U16:: </span><span class=cF2>//C callable</span><span class=cF0>
|
|
|
|
<a name="l25"></a> </span><span class=cF1>PUSH</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
|
|
|
|
<a name="l26"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>, </span><span class=cFC>RSP</span><span class=cF0>
|
2021-07-26 20:29:49 +01:00
|
|
|
<a name="l27"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>AL</span><span class=cF0>, </span><span class=cF1>U8</span><span class=cF0> </span><span class=cF3>SF_ARG1</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>] </span><span class=cF2>//</span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l715"><span class=cF4>SF_ARG1</span></a><span class=cF0>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l28"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>BL</span><span class=cF0>, </span><span class=cF1>U8</span><span class=cF0> </span><span class=cF3>SF_ARG2</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>]
|
|
|
|
<a name="l29"></a> </span><span class=cF1>CALL</span><span class=cF0> MUL_BY_HAND_U8_U8_TO_U16
|
|
|
|
<a name="l30"></a> </span><span class=cF1>MOVZX</span><span class=cF0> </span><span class=cFC>RAX</span><span class=cF0>, </span><span class=cFC>AX</span><span class=cF0>
|
|
|
|
<a name="l31"></a> </span><span class=cF1>POP</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
|
|
|
|
<a name="l32"></a> </span><span class=cF1>RET1</span><span class=cF0> </span><span class=cFE>16</span><span class=cF0>
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l33"></a>
|
|
|
|
<a name="l34"></a>_MUL_U64_U64_TO_U128::
|
|
|
|
<a name="l35"></a></span><span class=cF2>//64bit * 64bit-->128bit</span><span class=cF0>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l36"></a> </span><span class=cF1>PUSH</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
|
|
|
|
<a name="l37"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>, </span><span class=cFC>RSP</span><span class=cF0>
|
|
|
|
<a name="l38"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RBX</span><span class=cF0>, </span><span class=cF9>U64</span><span class=cF0> </span><span class=cF3>SF_ARG3</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>]
|
2021-07-26 20:29:49 +01:00
|
|
|
<a name="l39"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cFC>RAX</span><span class=cF0>, </span><span class=cF9>U64</span><span class=cF0> </span><span class=cF3>SF_ARG1</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>] </span><span class=cF2>//</span><a href="https://zeal-operating-system.github.io/ZealOS/Kernel/KernelA.HH.html#l715"><span class=cF4>SF_ARG1</span></a><span class=cF0>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l40"></a> </span><span class=cF1>MUL</span><span class=cF0> </span><span class=cF9>U64</span><span class=cF0> </span><span class=cF3>SF_ARG2</span><span class=cF0>[</span><span class=cFC>RBP</span><span class=cF0>] </span><span class=cF2>//Res RDX:RAX 128bit</span><span class=cF0>
|
|
|
|
<a name="l41"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cF9>U64</span><span class=cF0> [</span><span class=cFC>RBX</span><span class=cF0>], </span><span class=cFC>RAX</span><span class=cF0>
|
|
|
|
<a name="l42"></a> </span><span class=cF1>MOV</span><span class=cF0> </span><span class=cF9>U64</span><span class=cF0> </span><span class=cFE>8</span><span class=cF0>[</span><span class=cFC>RBX</span><span class=cF0>], </span><span class=cFC>RDX</span><span class=cF0>
|
|
|
|
<a name="l43"></a> </span><span class=cF1>POP</span><span class=cF0> </span><span class=cFC>RBP</span><span class=cF0>
|
|
|
|
<a name="l44"></a> </span><span class=cF1>RET1</span><span class=cF0> </span><span class=cFE>24</span><span class=cF0>
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l45"></a>};
|
|
|
|
<a name="l46"></a>
|
|
|
|
<a name="l47"></a></span><span class=cF2>//The convention is to put an underscore</span><span class=cF0>
|
|
|
|
<a name="l48"></a></span><span class=cF2>//on C callable asm routines.</span><span class=cF0>
|
|
|
|
<a name="l49"></a></span><span class=cF1>_extern</span><span class=cF0> _MUL_BY_HAND_U8_U8_TO_U16 </span><span class=cF9>U16</span><span class=cF0> MulU8(</span><span class=cF1>U8</span><span class=cF0> n1, </span><span class=cF1>U8</span><span class=cF0> n2);
|
|
|
|
<a name="l50"></a>
|
|
|
|
<a name="l51"></a></span><span class=cF1>class</span><span class=cF0> U128
|
|
|
|
<a name="l52"></a>{
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l53"></a> </span><span class=cF9>U64</span><span class=cF0> lo, hi;
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l54"></a>};
|
|
|
|
<a name="l55"></a>
|
|
|
|
<a name="l56"></a></span><span class=cF1>_extern</span><span class=cF0> _MUL_U64_U64_TO_U128 </span><span class=cF1>U0</span><span class=cF0> MulU64(</span><span class=cF9>I64</span><span class=cF0> n1, </span><span class=cF9>I64</span><span class=cF0> n2, U128 *_prod);
|
|
|
|
<a name="l57"></a>
|
|
|
|
<a name="l58"></a></span><span class=cF1>U0</span><span class=cF0> MulByHand()
|
|
|
|
<a name="l59"></a>{
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l60"></a> U128 p;
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l61"></a>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l62"></a> </span><span class=cF6>"2*7 =0x%X\n"</span><span class=cF0>, MulU8(</span><span class=cFE>2</span><span class=cF0>, </span><span class=cFE>7</span><span class=cF0>);
|
|
|
|
<a name="l63"></a> </span><span class=cF6>"100*10=0x%X\n"</span><span class=cF0>, MulU8(</span><span class=cFE>100</span><span class=cF0>, </span><span class=cFE>10</span><span class=cF0>);
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l64"></a>
|
2021-07-04 23:11:34 +01:00
|
|
|
<a name="l65"></a> MulU64(</span><span class=cFE>0x0123456789ABCDEF</span><span class=cF0>, </span><span class=cFE>0x1000001</span><span class=cF0>, &p);
|
|
|
|
<a name="l66"></a> </span><span class=cF6>"0x0123466789ABCDEF*0x1000001=0x%016X%016X\n"</span><span class=cF0>, p.hi, p.lo;
|
2021-07-03 05:07:57 +01:00
|
|
|
<a name="l67"></a>}
|
|
|
|
<a name="l68"></a>
|
|
|
|
<a name="l69"></a>MulByHand;
|
|
|
|
<a name="l70"></a>
|
|
|
|
</span></pre></body>
|
|
|
|
</html>
|