提交 d346d5c0 创建 作者: 李川's avatar 李川 提交者: 宋海霞

创建8086微机系统

上级 2fef9294
*.cir
*.xml
*.bak
/.vs
\ No newline at end of file
[submodule "8086"]
path = 8086
url = https://www.codecode.net/engintime/Dream-Logic/Intel-classic-chips/8086.git
branch = master
Subproject commit 6d3a6500d64f625ba3c2fa215e2c38cfd0293f43
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<project id="01f481df-5a46-421f-8d3a-29c436b1b0f2" name="8086-system" version="1">
<files>
<filefolder id="76cb3d2a-f92b-4283-a802-0d5d5fb9ad75" name="8086">
<file relativepath="8086\8086.dlsche"/>
<file relativepath="8086\ALU.dlsche"/>
<file relativepath="8086\BRANCH.dlsche"/>
<file relativepath="8086\CU.dlsche"/>
<file relativepath="8086\FLAG.dlsche"/>
<file relativepath="8086\PC.dlsche"/>
<file relativepath="8086\README.md"/>
<file relativepath="8086\REGS.dlsche"/>
<file relativepath="8086\rom.bat"/>
<file relativepath="8086\rom.masm"/>
<file relativepath="8086\rom.rxm"/>
<file relativepath="8086\uPC_NEXT.dlsche"/>
</filefolder>
<filefolder id="d7502e9e-b220-4715-a645-2f139d9b4f34" name="MEM">
<file relativepath="MEM\MEM.dlsche"/>
<file relativepath="MEM\ram.asm"/>
<file relativepath="MEM\ram.bat"/>
<file relativepath="MEM\ram.rxm"/>
<file relativepath="MEM\README.md"/>
</filefolder>
<filefolder id="c6ec748e-8eff-4fcb-9ff0-d62ba30af439" name="IO">
<file relativepath="IO\IO.dlsche"/>
</filefolder>
<file relativepath="top.dlsche"/>
</files>
</project>
添加文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="1227" version="1.1" width="2060" xmlns="http://www.w3.org/2000/svg">
<polygon fill="#ffff80" points="36 728, 36 703, 211 703, 236 728, 211 753, 36 753, 36 728" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="728">A[7..0]</text>
<polyline fill="none" points="1136 748, 936 748, 786 748, 436 748" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1136 778, 936 778, 786 778, 436 778" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1136 808, 936 808, 786 808, 436 808" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="748">A3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="778">A4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="808">A5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="848" y2="848"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1232" y="847">G1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1159" y="847">6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1176" x2="1136" y1="878" y2="878"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1256" y="877">^G2A</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1159" y="879">4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1176" x2="1136" y1="908" y2="908"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1256" y="907">^G2B</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1158" y="908">5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="748" y2="748"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1213" y="748">A</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1146" y="747">1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="778" y2="778"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1219" y="778">B</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1160" y="778">2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1186" x2="1136" y1="808" y2="808"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1213" y="808">C</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1147" y="808">3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="728" y2="728"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="725">Y0</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1355" y="728">15</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="758" y2="758"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="755">Y1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="758">14</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="788" y2="788"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="785">Y2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="788">13</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="818" y2="818"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="815">Y3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="818">12</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="848" y2="848"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="845">Y4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="848">11</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="878" y2="878"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="875">Y5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1356" y="878">10</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="908" y2="908"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="middle" x="1307" y="905">Y6</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1368" y="908">9</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1346" x2="1386" y1="938" y2="938"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1321" y="937">Y7</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1383" y="938">7</text>
<circle cx="1181" cy="908" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="788" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="819" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1342" cy="848" fill="#ffffff" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="728" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="878" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="757" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="907" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1341" cy="939" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="1181" cy="878" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<rect fill="#ffffff" fill-opacity="0.5" height="264" stroke="#000000" stroke-width="5" width="146" x="1188" y="694"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1251" y="685">U1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1189" y="1000">74LS138D</text>
<polygon fill="#ffff80" points="36 1178, 36 1153, 161 1153, 186 1178, 161 1203, 36 1203, 36 1178" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="1178">MIO</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="16" y="1118">低电平表示访问IO端口</text>
<polygon fill="#ffff80" points="36 428, 36 403, 211 403, 236 428, 211 453, 36 453, 36 428" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="428">WR_OUT</text>
<polygon fill="#ffff80" points="36 578, 36 553, 211 553, 236 578, 211 603, 36 603, 36 578" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="578">READ_OUT</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="368" y2="368"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="428" y2="428"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="576" x2="636" y1="398" y2="398"/>
<path d="M442 352 C 468 391, 441 441, 441 441, 441 441, 441 441, 441 441" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="442 351, 500 351" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="441 441, 499 441" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M500 351 C 552 351, 576 398, 576 398" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M498 441 C 554 441, 576 398, 576 398" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="491" y="341">U3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="479" y="492">OR</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="518" y2="518"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="446" x2="386" y1="578" y2="578"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="576" x2="636" y1="548" y2="548"/>
<path d="M442 502 C 468 541, 441 591, 441 591, 441 591, 441 591, 441 591" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="442 501, 500 501" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="441 591, 499 591" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M500 501 C 552 501, 576 548, 576 548" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M498 591 C 554 591, 576 548, 576 548" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="491" y="491">U4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="479" y="642">OR</text>
<polyline fill="none" points="386 578, 236 578" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="386 368, 286 368, 286 518" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polygon fill="#ffff80" points="1836 398, 1836 373, 2011 373, 2036 398, 2011 423, 1836 423, 1836 398" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="398">IOW</text>
<polygon fill="#ffff80" points="1836 548, 1836 523, 2011 523, 2036 548, 2011 573, 1836 573, 1836 548" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="548">IOR</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="125" font-weight="700" text-anchor="start" x="176" y="168">I/O地址译码单元</text>
<polyline fill="none" points="386 428, 236 428" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polygon fill="#ffff80" points="36 518, 36 493, 211 493, 236 518, 211 543, 36 543, 36 518" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="36" y="518">MIO</text>
<polyline fill="none" points="386 518, 236 518" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="646" x2="586" y1="898" y2="898"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="726" x2="786" y1="898" y2="898"/>
<circle cx="722" cy="898" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="646 848, 646 948, 716 898, 646 848" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="666" y="862">U5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="646" y="994">NOT</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="898">A6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="846" x2="786" y1="898" y2="898"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="846" x2="786" y1="958" y2="958"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="976" x2="1036" y1="928" y2="928"/>
<path d="M924 876 A 47 47 0 1 1 924 969" fill="none" stroke="#000000" stroke-linecap="round" stroke-width="5"/>
<polyline fill="none" points="925 970, 846 970, 846 876, 925 876" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="887" y="870">U6</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="870" y="1016">AND</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="436" y="958">A7</text>
<polyline fill="none" points="586 898, 436 898" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="786 958, 436 958" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="798" y2="748"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="828" y2="778"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="858" y2="808"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="948" y2="898"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="386" x2="436" y1="1008" y2="958"/>
<polyline fill="none" points="236 728, 386 728, 386 1008" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="1136 848, 1036 848, 1036 928" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="186 1178, 1086 1178, 1086 878, 1136 878" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 728, 1836 728" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 758, 1836 758" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 788, 1836 788" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 818, 1836 818" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 848, 1836 848" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 878, 1836 878" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 908, 1836 908" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1386 938, 1836 938" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polygon fill="#ffff80" points="1836 728, 1836 713, 2021 713, 2036 728, 2021 743, 1836 743, 1836 728" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="728">CS0</text>
<polygon fill="#ffff80" points="1836 758, 1836 743, 2021 743, 2036 758, 2021 773, 1836 773, 1836 758" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="758">CS1</text>
<polygon fill="#ffff80" points="1836 788, 1836 773, 2021 773, 2036 788, 2021 803, 1836 803, 1836 788" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="788">CS2</text>
<polygon fill="#ffff80" points="1836 818, 1836 803, 2021 803, 2036 818, 2021 833, 1836 833, 1836 818" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="818">CS3</text>
<polygon fill="#ffff80" points="1836 848, 1836 833, 2021 833, 2036 848, 2021 863, 1836 863, 1836 848" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="848">CS4</text>
<polygon fill="#ffff80" points="1836 878, 1836 863, 2021 863, 2036 878, 2021 893, 1836 893, 1836 878" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="878">CS5</text>
<polygon fill="#ffff80" points="1836 908, 1836 893, 2021 893, 2036 908, 2021 923, 1836 923, 1836 908" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="908">CS6</text>
<polygon fill="#ffff80" points="1836 938, 1836 923, 2021 923, 2036 938, 2021 953, 1836 953, 1836 938" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1836" y="938">CS7</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="728">(80H~87H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="758">(88H~8FH)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="788">(90H~97H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="818">(98H~9FH)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="848">(A0H~A7H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="878">(A8H~AFH)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="908">(B0H~B7H)</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="22" font-weight="400" text-anchor="start" x="1436" y="938">(B8H~BFH)</text>
<polyline fill="none" points="636 398, 1836 398" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="636 548, 1836 548" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<circle cx="286" cy="518" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
</svg>
# 说明
IO接口芯片地址译码模块
\ No newline at end of file
添加文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="1454" version="1.1" width="1952" xmlns="http://www.w3.org/2000/svg">
<polygon fill="#ffff80" points="21 402, 21 377, 146 377, 171 402, 146 427, 21 427, 21 402" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="402">ABUS[7..0]</text>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="422" y2="472"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="442" y2="492"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="462" y2="512"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="482" y2="532"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="502" y2="552"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="522" y2="572"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="542" y2="592"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="562" y2="612"/>
<polyline fill="none" points="271 472, 541 472" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 492, 541 492" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 512, 541 512" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 532, 541 532" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 552, 541 552" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 572, 541 572" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 592, 541 592" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 612, 541 612" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="472">ABUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="492">ABUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="512">ABUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="532">ABUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="552">ABUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="572">ABUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="592">ABUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="341" y="612">ABUS7</text>
<polygon fill="#ffff80" points="21 682, 21 657, 146 657, 171 682, 146 707, 21 707, 21 682" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="682">DBUS[7..0]</text>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="862" y2="812"/>
<polyline fill="none" points="541 812, 271 812" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="842" y2="792"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="822" y2="772"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="802" y2="752"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="782" y2="732"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="762" y2="712"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="742" y2="692"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="221" x2="271" y1="722" y2="672"/>
<polyline fill="none" points="271 792, 541 792" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 772, 541 772" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 752, 541 752" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 732, 541 732" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 712, 541 712" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 692, 541 692" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="271 672, 541 672" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="672">DBUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="692">DBUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="712">DBUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="732">DBUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="752">DBUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="772">DBUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="792">DBUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="12" font-weight="400" text-anchor="start" x="311" y="812">DBUS7</text>
<polygon fill="#ffff80" points="21 1112, 21 1087, 146 1087, 171 1112, 146 1137, 21 1137, 21 1112" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="1112">WR_OUT</text>
<polygon fill="#ffff80" points="21 892, 21 867, 146 867, 171 892, 146 917, 21 917, 21 892" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="892">CLK</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="472">DBUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="502">DBUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="532">DBUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="562">DBUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="592">DBUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="622">DBUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="652">DBUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="22" font-weight="400" text-anchor="start" x="1481" y="682">DBUS7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="472">A0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="492" y2="492"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="492">A1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="512" y2="512"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="512">A2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="532">A3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="552" y2="552"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="552">A4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="572" y2="572"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="572">A5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="592">A6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="612" y2="612"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="612">A7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="672" y2="672"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="672">D0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="692" y2="692"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="692">D1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="712" y2="712"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="712">D2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="732" y2="732"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="732">D3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="752" y2="752"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="752">D4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="772" y2="772"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="772">D5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="792" y2="792"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="792">D6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="812" y2="812"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="624" y="812">D7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="472">Q0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="492" y2="492"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="492">Q1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="512" y2="512"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="512">Q2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="532">Q3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="552" y2="552"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="552">Q4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="572" y2="572"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="572">Q5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="592">Q6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="741" x2="791" y1="612" y2="612"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="708" y="612">Q7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="872" y2="872"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="644" y="872">W^R</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="591" x2="541" y1="892" y2="892"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="644" y="892">CLK</text>
<rect fill="#ff8057" fill-opacity="0.5" height="490" stroke="#000000" stroke-width="5" width="150" x="591" y="442"/>
<polyline fill="none" points="591 882, 601 892, 591 902" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="90" font-weight="700" text-anchor="start" x="541" y="432">RAM</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="611" y="982">256RAM</text>
<polyline fill="none" points="1431 472, 1631 472" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 502, 1631 502" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 532, 1631 532" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 562, 1631 562" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 592, 1631 592" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 622, 1631 622" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 652, 1631 652" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1431 682, 1631 682" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="472" y2="422"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="502" y2="452"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="532" y2="482"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="562" y2="512"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="592" y2="542"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="622" y2="572"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="652" y2="602"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="1631" x2="1681" y1="682" y2="632"/>
<polyline fill="none" points="791 472, 1181 472" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 492, 1081 492, 1081 502, 1181 502" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 512, 1061 512, 1061 532, 1181 532" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 532, 1041 532, 1041 562, 1181 562" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 552, 1011 552, 1011 592, 1181 592" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 572, 981 572, 981 622, 1181 622" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 592, 951 592, 951 652, 1181 652" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="791 612, 921 612, 921 682, 1181 682" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="472">D0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="502" y2="502"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="502">D1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="532">D2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="562" y2="562"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="562">D3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="592">D4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="622" y2="622"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="622">D5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="652" y2="652"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="652">D6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1381" x2="1431" y1="682" y2="682"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="start" x="1348" y="682">D7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="472" y2="472"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="472">A0</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="502" y2="502"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="502">A1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="532" y2="532"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="532">A2</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="562" y2="562"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="562">A3</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="592" y2="592"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="592">A4</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="622" y2="622"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="622">A5</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="652" y2="652"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="652">A6</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1231" x2="1181" y1="682" y2="682"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1264" y="682">A7</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1221" x2="1181" y1="742" y2="742"/>
<text alignment-baseline="central" fill="#000000" font-family="Courier New" font-size="17" font-weight="400" text-anchor="end" x="1275" y="741">^EN</text>
<rect fill="#a0c0ff" fill-opacity="0.5" height="350" stroke="#000000" stroke-width="5" width="150" x="1231" y="432"/>
<circle cx="1226" cy="742" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="60" font-weight="700" text-anchor="start" x="1131" y="412">MEM_gate</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1231" y="832">BUS_TRANS8</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="150" font-weight="700" text-anchor="start" x="651" y="192">MEM模块</text>
<polygon fill="#ffff80" points="21 1172, 21 1147, 146 1147, 171 1172, 146 1197, 21 1197, 21 1172" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="1172">MIO</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1112" y2="1112"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1172" y2="1172"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="811" x2="871" y1="1142" y2="1142"/>
<path d="M677 1096 C 703 1135, 676 1185, 676 1185, 676 1185, 676 1185, 676 1185" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="677 1095, 735 1095" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="676 1185, 734 1185" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M735 1095 C 787 1095, 811 1142, 811 1142" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M733 1185 C 789 1185, 811 1142, 811 1142" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="726" y="1085">U1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="714" y="1236">OR</text>
<polygon fill="#ffff80" points="21 1372, 21 1347, 146 1347, 171 1372, 146 1397, 21 1397, 21 1372" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="21" y="1372">READ_OUT</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1312" y2="1312"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="681" x2="621" y1="1372" y2="1372"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="811" x2="871" y1="1342" y2="1342"/>
<path d="M677 1296 C 703 1335, 676 1385, 676 1385, 676 1385, 676 1385, 676 1385" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="677 1295, 735 1295" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="676 1385, 734 1385" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M735 1295 C 787 1295, 811 1342, 811 1342" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<path d="M733 1385 C 789 1385, 811 1342, 811 1342" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="726" y="1285">U2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="714" y="1436">OR</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="21" y="1312">MIO为高电平表示访问存储器</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="281" x2="221" y1="1172" y2="1172"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="361" x2="421" y1="1172" y2="1172"/>
<circle cx="357" cy="1172" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="281 1122, 281 1222, 351 1172, 281 1122" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="301" y="1136">U3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="281" y="1268">NOT</text>
<polyline fill="none" points="221 562, 221 402, 171 402" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="221 862, 221 682, 171 682" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polyline fill="none" points="1681 632, 1681 412, 1781 412" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="20"/>
<polygon fill="#ffff80" points="1781 412, 1781 387, 1906 387, 1931 412, 1906 437, 1781 437, 1781 412" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1781" y="412">DBUS[7..0]</text>
<polyline fill="none" points="171 1372, 621 1372" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="221 1172, 171 1172" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="421 1172, 621 1172" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="621 1112, 171 1112" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="621 1312, 521 1312, 521 1172" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="541 892, 171 892" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="871 1142, 921 1142, 921 1012, 471 1012, 471 872, 541 872" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="871 1342, 1121 1342, 1121 742, 1181 742" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<circle cx="521" cy="1172" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
</svg>
# 说明
8086 微机系统的MEM主存储器,存储指令和数据
\ No newline at end of file
/*******************************************************************************
Copyright (c) 2008 - 2018 北京英真时代科技有限公司。保留所有权利。
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef unsigned char BYTE;
typedef long BOOL;
#define FALSE 0
#define TRUE 1
#define MAX_LINE_LENGTH 256 // 一行代码最多可以有多少个字符
#define MAX_LINE_COUNT 1024 // 源代码文件最多可以有多少行
#define MAX_MACHINE_CODE_BYTE_COUNT 256 // 源代码编译后最多可以有多少个字节机器码
#define MAX_SYMBOL_LENGTH 64 // 一个符号最多可以包含多少个字符
#define MAX_SYMBOL_COUNT 256 // 源代码文件中最多可以包含多少个符号
#ifndef MAX_PATH
#define MAX_PATH 256 // 文件路径最多可以包含多少个字符
#endif
// 代码行数据库。记录源代码文件中所有代码行的信息(包括注释行、空行)
struct LINE_RECORD
{
char line_string[MAX_LINE_LENGTH]; // 代码行的内容
unsigned long line_num; // 行号
unsigned long address; // 此行代码转换的机器码在映像文件中的地址(偏移)
int machine_code_count; // 此行代码转换的机器码的字节数量
unsigned long flag; // 代码行标志位,32位
};
struct LINE_RECORD line_database[MAX_LINE_COUNT] = { 0 };
int line_count = 0;
int machine_code_line_count = 0; // 记录产生了机器码的代码行的数量
// 在此定义所有的代码行标志位。注意,代码行标志位是按位或的关系。
#define LF_INSTRUCTION 0x00000001 // 代码行标志位的最低位是1,表示此行是一条指令,否则表示此行是数据
// 重定位表。如果指令中使用了标号、变量名等符号,在第一次扫描时无法确定他们的地址,需要
// 在第二次扫描时进行重定位。
struct REALLOCATE
{
unsigned long address; // 第一次扫描时,在这里记录了需要重定位的机器码的地址(偏移),
// 第二次扫描时,根据符号的地址进行重定位。
char symbol_name[MAX_SYMBOL_LENGTH]; // 需要重定位的符号名称。
int line_num; // 行号。
};
struct REALLOCATE reallocate_table[MAX_LINE_COUNT] = { 0 };
int reallocate_count = 0;
// 符号表。符号包括源代码中的标号、变量名。
struct SYMBOL
{
char name[MAX_SYMBOL_LENGTH]; // 符号名称
unsigned long address; // 符号表示的地址。重定位时需要用到。
int machine_code_count; // 符号生成的机器码的数量(以字节为单位)。
int line_num; // 行号
int ref_count; // 引用计数
};
struct SYMBOL symbol_table[MAX_SYMBOL_COUNT] = { 0 };
int symbol_count = 0;
// 汇编过程的状态
enum
{
AS_BEGIN // 起始状态。在遇到代码段名称前,处于此状态
, AS_INT_TABLE // 正在处理中断向量列表。遇到向量列表名称后,遇到代码段名称前,处于此状态
, AS_TEXT // 正在处理代码段。遇到代码段名称后,遇到数据的名称前,处于此状态
, AS_DATA // 正在处理数据段。遇到数据段名称后,处于此状态
};
unsigned long assembler_state = AS_BEGIN;
//
// 在下面定义所有的关键字
//
// 段名称
const char* int_table_section_keyword = ".int_table"; // 中断向量列表标志
const char* code_section_keyword = ".text"; // 代码段标志
char const* data_section_keyword = ".data"; // 数据段标志
// 指令名称
const char* mov_instruction_keyword = "mov";
const char* add_instruction_keyword = "add";
const char* adc_instruction_keyword = "adc";
const char* sub_instruction_keyword = "sub";
const char* sbb_instruction_keyword = "sbb";
const char* and_instruction_keyword = "and";
const char* or_instruction_keyword = "or";
const char* xor_instruction_keyword = "xor";
const char* shr_instruction_keyword = "shr";
const char* shl_instruction_keyword = "shl";
const char* rcr_instruction_keyword = "rcr";
const char* rcl_instruction_keyword = "rcl";
const char* sal_instruction_keyword = "sal";
const char* sar_instruction_keyword = "sar";
const char* rol_instruction_keyword = "rol";
const char* ror_instruction_keyword = "ror";
const char* not_instruction_keyword = "not";
const char* push_instruction_keyword = "push";
const char* pop_instruction_keyword = "pop";
const char* in_instruction_keyword = "in";
const char* out_instruction_keyword = "out";
const char* call_instruction_keyword = "call";
const char* ret_instruction_keyword = "ret";
const char* int_instruction_keyword = "int";
const char* iret_instruction_keyword = "iret";
const char* inc_instruction_keyword = "inc";
const char* dec_instruction_keyword = "dec";
const char* lea_instruction_keyword = "lea";
const char* cmp_instruction_keyword = "cmp";
const char* nop_instruction_keyword = "nop";
const char* cli_instruction_keyword = "cli";
const char* sti_instruction_keyword = "sti";
const char* jmp_instruction_keyword = "jmp";
const char* jc_instruction_keyword = "jc";
const char* jz_instruction_keyword = "jz";
const char* je_instruction_keyword = "je";
const char* jne_instruction_keyword = "jne";
const char* jnz_instruction_keyword = "jnz";
// 通用寄存器名称
const char* al_register_keyword = "al";
const char* bl_register_keyword = "bl";
const char* cl_register_keyword = "cl";
const char* dl_register_keyword = "dl";
const char* sp_register_keyword = "sp";
const char* bp_register_keyword = "bp";
const char* si_register_keyword = "si";
const char* di_register_keyword = "di";
const char* cs_register_keyword = "cs";
const char* ds_register_keyword = "ds";
const char* ss_register_keyword = "ss";
const char* es_register_keyword = "es";
const char* al_register_indirect_keyword = "[al]";
const char* bl_register_indirect_keyword = "[bl]";
const char* cl_register_indirect_keyword = "[cl]";
const char* dl_register_indirect_keyword = "[dl]";
const char* sp_register_indirect_keyword = "[sp]";
const char* bp_register_indirect_keyword = "[bp]";
const char* si_register_indirect_keyword = "[si]";
const char* di_register_indirect_keyword = "[di]";
const char* cs_register_indirect_keyword = "[cs]";
const char* ds_register_indirect_keyword = "[ds]";
const char* ss_register_indirect_keyword = "[ss]";
const char* es_register_indirect_keyword = "[es]";
const char* delimit_char = "\n\t\r "; // 需要忽略的空白字符
const char* delimit_char_comma = "\n\t\r, "; // 需要忽略的空白字符,包括英文逗号
// 汇编产生的机器码
#define MAX_MACHINE_CODE 1024
BYTE machine_code[MAX_MACHINE_CODE];
unsigned long machine_code_address = 0;
unsigned long machine_code_old_address = 0;
const char* assembly_file_name = NULL; // 汇编文件路径
const char* target_file_name = NULL; // 目标文件路径
const char* list_file_name = NULL; // 列表文件路径
const char* dbg_file_name = NULL; // 调试信息文件路径
const unsigned long dbg_file_magic = 58;
const unsigned long dbg_file_version = 1;
// 输出汇编过程中发现的语法错误信息
void error_msg(const char* error_msg, int line_num)
{
if (line_num >= 1)
{
printf("%s:%d: error: %s\n", assembly_file_name, line_num, error_msg);
}
else
{
printf("%s: error: %s\n", assembly_file_name, error_msg);
}
exit(1);
}
char formated_msg[1024]; // 将格式化后的错误信息放在此字符串中。
void error_msg_miss_op(const char* instruction_name, int line_num)
{
sprintf(formated_msg, "%s 指令缺少操作数。", instruction_name);
error_msg(formated_msg, line_num);
}
void error_msg_wrong_op(const char* instruction_name, int line_num)
{
sprintf(formated_msg, "%s 指令不支持这样的操作数。", instruction_name);
error_msg(formated_msg, line_num);
}
void error_msg_same_symbol(const char* symbol, int line_num, int ref_line_num)
{
sprintf(formated_msg, "符号 %s 重复定义。参见第 %d 行。", symbol, ref_line_num);
error_msg(formated_msg, line_num);
}
void error_msg_keyword_symbol(const char* symbol, int line_num)
{
sprintf(formated_msg, "不能使用保留的关键字 %s 作为符号名称。", symbol);
error_msg(formated_msg, line_num);
}
void error_msg_keyword_int_vector(const char* vector, int line_num)
{
sprintf(formated_msg, "不能使用保留的关键字 %s 作为中断向量名称。", vector);
error_msg(formated_msg, line_num);
}
void error_msg_wrong_data(const char* data, int line_num)
{
sprintf(formated_msg, "%s 不是有效的数据。", data);
error_msg(formated_msg, line_num);
}
// 输出汇编过程中发现的警告信息
void warning_msg(const char* warning_msg, int line_num)
{
if (line_num >= 1)
{
printf("%s:%d: warning: %s\n", assembly_file_name, line_num, warning_msg);
}
else
{
printf("%s: warning: %s\n", assembly_file_name, warning_msg);
}
}
void warning_msg_invalid_line(int line_num)
{
warning_msg("忽略无效的代码行。", line_num);
}
void warning_msg_unref_symbol(const char* symbol, int line_num)
{
sprintf(formated_msg, "符号 %s 未被引用。", symbol);
warning_msg(formated_msg, line_num);
}
// 判断是否是立即数。如果是数字开头,或者是负号开头的,就认为是立即数。
int is_immediate(const char* token)
{
return (isdigit(token[0]) || '-' == token[0]) ? 1 : 0;
}
// 判断是否是立即数地址。类如,[4]
int is_immediate_address(const char* token)
{
// 最后一个字符必须是"]"
if (token[strlen(token) - 1] != ']')
{
return 0;
}
// 第一个字符必须是"["
if (token[0] != '[')
{
return 0;
}
// 后面的字符必须是数字开头
return (isdigit(token[1]) || ' ' == token[1]) ? 1 : 0;
}
// 判断是否是主存数据
int is_main_memory(const char* token)
{
return (isdigit(token[0]) || '@' == token[0]) ? 1 : 0;
}
// 指令操作数类型
enum
{
OT_REGISTER_AL // al
, OT_REGISTER_BL // bl
, OT_REGISTER_CL // cl
, OT_REGISTER_DL // dl
, OT_REGISTER_SP // sp
, OT_REGISTER_BP // bp
, OT_REGISTER_SI // si
, OT_REGISTER_DI // di
, OT_REGISTER_CS // cs
, OT_REGISTER_DS // ds
, OT_REGISTER_SS // ss
, OT_REGISTER_ES // es
, OT_REGISTER_AL_INDIRECT // [al]
, OT_REGISTER_BL_INDIRECT // [bl]
, OT_REGISTER_CL_INDIRECT // [cl]
, OT_REGISTER_DL_INDIRECT // [dl]
, OT_REGISTER_SP_INDIRECT // [sp]
, OT_REGISTER_BP_INDIRECT // [bp]
, OT_REGISTER_SI_INDIRECT // [si]
, OT_REGISTER_DI_INDIRECT // [di]
, OT_REGISTER_CS_INDIRECT // [cs]
, OT_REGISTER_DS_INDIRECT // [ds]
, OT_REGISTER_SS_INDIRECT // [ss]
, OT_REGISTER_ES_INDIRECT // [es]
, OT_IMMEDIATE // 立即数
, OT_SYMBOL // 符号
};
// 得到指令操作数的类型
unsigned long get_operand_type(const char* op)
{
unsigned long op_type;
if (stricmp(op, al_register_keyword) == 0)
{
op_type = OT_REGISTER_AL;
}
else if (stricmp(op, bl_register_keyword) == 0)
{
op_type = OT_REGISTER_BL;
}
else if (stricmp(op, cl_register_keyword) == 0)
{
op_type = OT_REGISTER_CL;
}
else if (stricmp(op, dl_register_keyword) == 0)
{
op_type = OT_REGISTER_DL;
}
else if (stricmp(op, sp_register_keyword) == 0)
{
op_type = OT_REGISTER_SP;
}
else if (stricmp(op, bp_register_keyword) == 0)
{
op_type = OT_REGISTER_BP;
}
else if (stricmp(op, si_register_keyword) == 0)
{
op_type = OT_REGISTER_SI;
}
else if (stricmp(op, di_register_keyword) == 0)
{
op_type = OT_REGISTER_DI;
}
else if (stricmp(op, cs_register_keyword) == 0)
{
op_type = OT_REGISTER_CS;
}
else if (stricmp(op, ds_register_keyword) == 0)
{
op_type = OT_REGISTER_DS;
}
else if (stricmp(op, ss_register_keyword) == 0)
{
op_type = OT_REGISTER_SS;
}
else if (stricmp(op, es_register_keyword) == 0)
{
op_type = OT_REGISTER_ES;
}
else if (stricmp(op, al_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_AL_INDIRECT;
}
else if (stricmp(op, bl_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_BL_INDIRECT;
}
else if (stricmp(op, cl_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_CL_INDIRECT;
}
else if (stricmp(op, dl_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_DL_INDIRECT;
}
else if (stricmp(op, sp_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_SP_INDIRECT;
}
else if (stricmp(op, bp_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_BP_INDIRECT;
}
else if (stricmp(op, si_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_SI_INDIRECT;
}
else if (stricmp(op, di_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_DI_INDIRECT;
}
else if (stricmp(op, cs_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_CS_INDIRECT;
}
else if (stricmp(op, ds_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_DS_INDIRECT;
}
else if (stricmp(op, ss_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_SS_INDIRECT;
}
else if (stricmp(op, es_register_indirect_keyword) == 0)
{
op_type = OT_REGISTER_ES_INDIRECT;
}
else if (is_immediate(op))
{
op_type = OT_IMMEDIATE;
}
else
{
op_type = OT_SYMBOL;
}
return op_type;
}
// 根据寄存器,得到一个机器码
char get_machine_code_from_r(unsigned long op_type)
{
return (char)(op_type - OT_REGISTER_AL);
}
// 根据通用寄存器和机器码的基础值,得到一个机器码
char get_machine_code_from_r_indirect(unsigned long op_type)
{
return (char)(op_type - OT_REGISTER_AL_INDIRECT);
}
// 根据立即数得到一个机器码。注意,允许使用负数,所以返回值是带符号的 8 位 char。
char get_machine_code_from_immediate(const char* immediate)
{
char* end;
int start_index = (immediate[0] == '-' ? 1 : 0);
int base = (immediate[start_index] == '0' && (immediate[start_index + 1] == 'x' || immediate[start_index + 1] == 'X')) ? 16 : 10;
return (char)strtol(immediate, &end, base);
}
// 根据立即数地址得到一个机器码。首先去除中括号,再将立即数转换为带符号的8位字符。
char get_machine_code_from_immediate_address(const char* immediate)
{
char d[7];
int i = 0;
int t = strlen(immediate);
for (; i < t - 2; i++)
{
d[i] = immediate[i + 1];
}
char* temp;
int base = (immediate[1] == '0' && (immediate[2] == 'x' || immediate[2] == 'X')) ? 16 : 10;
return (char)strtol(d, &temp, base);
}
// 向重定位表中添加一个重定位信息
void add_reallocate(const char* symbol, int line_num)
{
reallocate_table[reallocate_count].address = machine_code_address;
strcpy(reallocate_table[reallocate_count].symbol_name, symbol);
reallocate_table[reallocate_count].line_num = line_num;
reallocate_count++;
}
//////////////////////////////////////////////////////////////////////////////////////
// 汇编指令编译函数
// mov op1, op2
//
void parse_mov(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(mov_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES)
&& OT_IMMEDIATE == op2_type)
{
// mov reg, immediate
// 操作码
machine_code[machine_code_address] = 0x01;
machine_code_address++;
// reg为目的寄存器操作数
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数机器码
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_ES))
{
// mov reg, reg
// 操作码
machine_code[machine_code_address] = 0x02;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES) && OT_SYMBOL == op2_type)
{
// mov reg, symbol
// 操作码
machine_code[machine_code_address] = 0x03;
machine_code_address++;
// 目的操作数机器码
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_ES)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_ES_INDIRECT))
{
// mov reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x04;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL_INDIRECT && op1_type <= OT_REGISTER_ES_INDIRECT)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_ES))
{
// mov [reg], reg
// 操作码
machine_code[machine_code_address] = 0x05;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r_indirect(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL_INDIRECT && op1_type <= OT_REGISTER_ES_INDIRECT) && OT_IMMEDIATE == op2_type)
{
// mov [reg], immediate
// 操作码
machine_code[machine_code_address] = 0x06;
machine_code_address++;
// 目的操作数
machine_code[machine_code_address] = get_machine_code_from_r_indirect(op1_type);
machine_code_address++;
// 立即数机器码
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if (OT_SYMBOL == op1_type && (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_ES))
{
// mov symbol, reg
machine_code[machine_code_address] = 0x07;
machine_code_address++;
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
machine_code[machine_code_address] = rs;
machine_code_address++;
// 重定位
add_reallocate(op1, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(mov_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
// 加法指令
// add op1, op2
void parse_add(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(add_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// add reg, reg
// 操作码
machine_code[machine_code_address] = 0x08;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// add reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x0a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// add reg, symbol
// 操作码
machine_code[machine_code_address] = 0x0c;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// add reg, immediate
machine_code[machine_code_address] = 0x0e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(add_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 带进位的加法指令
// adc op1, op2
void parse_adc(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(adc_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// adc reg, reg
// 操作码
machine_code[machine_code_address] = 0x10;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// adc reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x12;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// adc reg, symbol
// 操作码
machine_code[machine_code_address] = 0x14;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// adc reg, immediate
machine_code[machine_code_address] = 0x16;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(adc_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
////////////////////////////////////////////////////////////////////////////////////////////
// 减法指令
// sub op1, op2
void parse_sub(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sub_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// sub reg, reg
// 操作码
machine_code[machine_code_address] = 0x18;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// sub reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x1a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// sub reg, symbol
// 操作码
machine_code[machine_code_address] = 0x1c;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// sub reg, immediate
machine_code[machine_code_address] = 0x1e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(sub_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 借位减法指令
// sbb op1, op2
void parse_sbb(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sbb_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// sbb reg, reg
// 操作码
machine_code[machine_code_address] = 0x20;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// sbb reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x22;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// sbb reg, symbol
// 操作码
machine_code[machine_code_address] = 0x24;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// sbb reg, immediate
machine_code[machine_code_address] = 0x26;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(sbb_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////////////////
// 增减1指令
// inc reg
void parse_inc(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(inc_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_DI)
{
//
machine_code[machine_code_address] = 0x78;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(inc_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// dec reg
void parse_dec(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(dec_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_DI)
{
//
machine_code[machine_code_address] = 0x79;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(dec_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// 按位与指令
// and op1, op2
void parse_and(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(and_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// and reg, reg
// 操作码
machine_code[machine_code_address] = 0x2a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// and reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x2c;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// and reg, symbol
// 操作码
machine_code[machine_code_address] = 0x2e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// and reg, immediate
machine_code[machine_code_address] = 0x30;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(and_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////////////
// 按位或指令
// or op1, op2
void parse_or(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(or_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// or reg, reg
// 操作码
machine_code[machine_code_address] = 0x32;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// or reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x34;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// or reg, symbol
// 操作码
machine_code[machine_code_address] = 0x36;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// or reg, immediate
machine_code[machine_code_address] = 0x38;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(or_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////////////
// 按位异或指令
// xor op1, op2
void parse_xor(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(xor_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// xor reg, reg
// 操作码
machine_code[machine_code_address] = 0x3a;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL_INDIRECT && op2_type <= OT_REGISTER_DI_INDIRECT))
{
// xor reg, [reg]
// 操作码
machine_code[machine_code_address] = 0x3c;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r_indirect(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// xor reg, symbol
// 操作码
machine_code[machine_code_address] = 0x3e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// xor reg, immediate
machine_code[machine_code_address] = 0x40;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else
{
error_msg_wrong_op(xor_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
////////////////////////////////////////////////////
//
// push reg
void parse_push(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char_comma);
if (NULL == op)
{
error_msg_miss_op(push_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_ES)
{
machine_code[machine_code_address] = 0x42;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(push_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////
//
// pop reg
void parse_pop(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char_comma);
if (NULL == op)
{
error_msg_miss_op(pop_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_ES)
{
machine_code[machine_code_address] = 0x43;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(pop_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
//
// not reg
void parse_not(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(not_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
// 目标操作数只能是通用寄存器
if (op_type >= OT_REGISTER_AL && op_type <= OT_REGISTER_DI)
{
machine_code[machine_code_address] = 0x44;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op_type);
machine_code_address++;
}
else
{
error_msg_wrong_op(not_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////
//
// cmp op1, op2
void parse_cmp(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(cmp_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_IMMEDIATE == op2_type)
{
// cmp reg, immediate
machine_code[machine_code_address] = 0x47;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 立即数
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// cmp reg, reg
// 操作码
machine_code[machine_code_address] = 0x49;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(xor_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////
//
// 接口访问指令
// in op1, op2
void parse_in(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(in_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if (OT_REGISTER_AL == op1_type && OT_IMMEDIATE == op2_type)
{
// in al, imm
machine_code[machine_code_address] = 0x4b;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_immediate(op2);
machine_code_address++;
}
else if (OT_REGISTER_AL == op1_type && OT_REGISTER_DL == op2_type)
{
// in al, dl
machine_code[machine_code_address] = 0x4c;
machine_code_address++;
//
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
rd = get_machine_code_from_r(op1_type);
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(in_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// out op1, op2
void parse_out(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(out_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if (OT_REGISTER_DL == op1_type && OT_REGISTER_AL == op2_type)
{
// out dl, al
machine_code[machine_code_address] = 0x4d;
machine_code_address++;
//
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
rd = get_machine_code_from_r(op1_type);
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else if (OT_IMMEDIATE == op1_type && OT_REGISTER_AL == op2_type)
{
// out imm, al
machine_code[machine_code_address] = 0x4e;
machine_code_address++;
//
machine_code[machine_code_address] = get_machine_code_from_r(op2_type);
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_immediate(op1);
machine_code_address++;
}
else
{
error_msg_wrong_op(out_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
///////////////////////////////////////////////////////
//
// lea reg, symbol
void parse_lea(int line_num)
{
char *op1, *op2;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(lea_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI) && OT_SYMBOL == op2_type)
{
// lea reg, symbol
machine_code[machine_code_address] = 0x4f;
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_r(op1_type);
machine_code_address++;
// 重定位
add_reallocate(op2, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(lea_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////
//
// jz/je symbol
void parse_jz(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jz_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
// jz symbol
machine_code[machine_code_address] = 0x54;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jz_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////
//
// jnz/jne symbol
void parse_jnz(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jnz_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
machine_code[machine_code_address] = 0x55;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jnz_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////
//
// jc symbol
void parse_jc(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jc_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
machine_code[machine_code_address] = 0x56;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jc_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////
// jmp symbol
void parse_jmp(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(jmp_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
// jmp symbol
machine_code[machine_code_address] = 0x57;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(jmp_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
////////////////////////////////////////////////////////////////////////////////////
//
// int immediate
void parse_int(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(int_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_IMMEDIATE == op_type)
{
// int immediate
machine_code[machine_code_address] = 0x5a;
machine_code_address++;
//
machine_code[machine_code_address] = 0xB4;
machine_code_address++;
machine_code[machine_code_address] = get_machine_code_from_immediate(op);
machine_code_address++;
}
else
{
error_msg_wrong_op(int_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// iret
void parse_iret(int line_num)
{
machine_code[machine_code_address] = 0x5d;
machine_code_address++;
//
machine_code[machine_code_address] = 0x44;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////
//
// 移位指令
// sal op1, op2
void parse_sal(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sal_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x5f;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(sal_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// sar op1, op2
void parse_sar(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(sar_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x61;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(sar_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// shl op1, op2
void parse_shl(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(shl_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x63;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(shl_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// shr op1, op2
void parse_shr(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(shr_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x65;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(shr_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// rol op1, op2
void parse_rol(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(rol_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x67;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(rol_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// ror op1, op2
void parse_ror(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(ror_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x69;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(ror_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// rcl op1, op2
void parse_rcl(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(rcl_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x6b;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(rcl_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// rcr op1, op2
void parse_rcr(int line_num)
{
char *op1, *op2;
char rs, rd;
unsigned long op1_type, op2_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op1 = strtok(NULL, delimit_char_comma);
op2 = strtok(NULL, delimit_char);
if (NULL == op1 || NULL == op2)
{
error_msg_miss_op(rcr_instruction_keyword, line_num);
}
op1_type = get_operand_type(op1);
op2_type = get_operand_type(op2);
if ((op1_type >= OT_REGISTER_AL && op1_type <= OT_REGISTER_DI)
&& (op2_type >= OT_REGISTER_AL && op2_type <= OT_REGISTER_DI))
{
// 操作码
machine_code[machine_code_address] = 0x6d;
machine_code_address++;
// 源操作数寄存器rs
rs = get_machine_code_from_r(op2_type);
rs = rs << 4;
// 目的操作数
rd = get_machine_code_from_r(op1_type);
// 操作数机器码
machine_code[machine_code_address] = rs | rd;
machine_code_address++;
}
else
{
error_msg_wrong_op(rcr_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
//
// nop
void parse_nop(int line_num)
{
machine_code[machine_code_address] = 0x6f;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
//////////////////////////////////////////////////////////////////////////
//
// call symbol
void parse_call(int line_num)
{
char *op;
unsigned long op_type;
if (assembler_state != AS_TEXT)
{
warning_msg_invalid_line(line_num);
return;
}
op = strtok(NULL, delimit_char);
if (NULL == op)
{
error_msg_miss_op(call_instruction_keyword, line_num);
}
op_type = get_operand_type(op);
if (OT_SYMBOL == op_type)
{
// call symbol
machine_code[machine_code_address] = 0x71;
machine_code_address++;
// 重定位
add_reallocate(op, line_num);
machine_code_address++;
}
else
{
error_msg_wrong_op(call_instruction_keyword, line_num);
}
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////
//
// ret
void parse_ret(int line_num)
{
machine_code[machine_code_address] = 0x73;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////
//
// cli
void parse_cli(int line_num)
{
machine_code[machine_code_address] = 0x74;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
/////////////////////////////////////////////////////////////////////////////
//
// sti
void parse_sti(int line_num)
{
machine_code[machine_code_address] = 0x75;
machine_code_address++;
//
// 在代码行数据库中,标记此行是一个指令行
//
line_database[line_count].flag |= LF_INSTRUCTION;
}
// 向符号表中添加一个符号
void add_symbol(const char* symbol, int line_num)
{
int i;
// 符号名称不能重复
for (i = 0; i < symbol_count; i++)
{
if (stricmp(symbol, symbol_table[i].name) == 0)
{
error_msg_same_symbol(symbol, line_num, symbol_table[i].line_num);
}
}
// 符号数量有限
if (symbol_count == MAX_SYMBOL_COUNT)
{
sprintf(formated_msg, "定义了太多的符号。最多可以定义 %d 个符号。", MAX_SYMBOL_COUNT);
error_msg(formated_msg, line_num);
}
// 添加符号
strcpy(symbol_table[symbol_count].name, symbol);
symbol_table[symbol_count].address = machine_code_address;
symbol_table[symbol_count].line_num = line_num;
symbol_count++;
}
// 解析符号
void parse_symbol(const char* symbol_with_colon, int line_num)
{
char symbol[MAX_SYMBOL_LENGTH];
char* token;
// 删除符号末尾的冒号
strcpy(symbol, symbol_with_colon);
symbol[strlen(symbol) - 1] = 0;
if (AS_TEXT == assembler_state)
{
// 代码段中的标号作为符号。记录到符号表中,不产生机器码。
add_symbol(symbol, line_num);
// 标号必须单独占一行,否则报错
if (strtok(NULL, delimit_char) != NULL)
{
error_msg("标号必须单独占用一行。", line_num);
}
}
else if (AS_DATA == assembler_state)
{
// 数据段中的变量作为符号。一个变量可以包含多个字节数据。记录到符号表中,产生机器码。
add_symbol(symbol, line_num);
while ((token = strtok(NULL, delimit_char)) != NULL)
{
if (!is_immediate(token))
{
error_msg_wrong_data(token, line_num);
}
machine_code[machine_code_address] = get_machine_code_from_immediate(token);
machine_code_address++;
symbol_table[symbol_count - 1].machine_code_count++;
}
}
else
{
warning_msg_invalid_line(line_num);
}
}
// 解析中断向量
void parse_int_vector(const char* symbol_with_colon, int line_num)
{
char symbol[MAX_SYMBOL_LENGTH];
char* token;
if (AS_INT_TABLE == assembler_state)
{
// 重定位
add_reallocate(symbol_with_colon, line_num);
machine_code_address++;
// 中断向量必须单独占一行,否则报错
if (strtok(NULL, delimit_char) != NULL)
{
error_msg("中断向量必须单独占用一行。", line_num);
}
}
}
// 解析中断向量表开始标志
void parse_int_table_section_keyword(int line_num)
{
// 中断向量表标志
if (AS_TEXT == assembler_state)
{
error_msg("中断向量表不能定义在代码段的后面。", line_num);
}
else if (AS_INT_TABLE == assembler_state)
{
error_msg("定义了重复的中断向量列表。", line_num);
}
assembler_state = AS_INT_TABLE;
}
// 解析代码段开始标志
void parse_code_section_keyword(int line_num)
{
// 代码段标志
if (AS_DATA == assembler_state)
{
error_msg("代码段不能定义在数据段的后面。", line_num);
}
else if (AS_TEXT == assembler_state)
{
error_msg("定义了重复的代码段。", line_num);
}
//若当前地址小于0x10,则补充空行
for (; machine_code_address < 0x10;)
{
line_database[line_count].line_num = line_num;
line_database[line_count].address = machine_code_address;
machine_code_address++;
machine_code_old_address++;
}
// 代码段的起始地址为0x10
assembler_state = AS_TEXT;
}
// 解析数据段开始标志
void parse_data_section_keyword(int line_num)
{
// 数据段标志
if (AS_DATA == assembler_state)
{
error_msg("定义了重复的数据段。", line_num);
}
else if (AS_BEGIN == assembler_state)
{
error_msg("数据段不能定义在代码段的前面。", line_num);
}
assembler_state = AS_DATA;
}
// 定义关键字和解析函数的对应关系
typedef void(*PARSE_FUNCTION)(int line_num);
struct KEYWORD_FUNCTION_ENTRY
{
const char** keyword;
PARSE_FUNCTION parse_function;
};
//
// 必须将关键字及其解析函数放在下面的表中。从而可以使用“表驱动”的编程模式。
//
struct KEYWORD_FUNCTION_ENTRY keyword_function_table[] =
{
{ NULL, NULL } // 未用
,{ &int_table_section_keyword, parse_int_table_section_keyword }
,{ &code_section_keyword, parse_code_section_keyword }
,{ &data_section_keyword, parse_data_section_keyword }
,{ &mov_instruction_keyword, parse_mov }
,{ &jmp_instruction_keyword, parse_jmp }
,{ &add_instruction_keyword, parse_add }
,{ &adc_instruction_keyword, parse_adc }
,{ &sub_instruction_keyword, parse_sub }
,{ &sbb_instruction_keyword, parse_sbb }
,{ &and_instruction_keyword, parse_and }
,{ &or_instruction_keyword, parse_or }
,{ &jc_instruction_keyword, parse_jc }
,{ &jz_instruction_keyword, parse_jz }
,{ &je_instruction_keyword, parse_jz }
,{ &jnz_instruction_keyword, parse_jnz }
,{ &jne_instruction_keyword, parse_jnz }
,{ &call_instruction_keyword, parse_call }
,{ &push_instruction_keyword, parse_push }
,{ &pop_instruction_keyword, parse_pop }
,{ &in_instruction_keyword, parse_in }
,{ &out_instruction_keyword, parse_out }
,{ &ret_instruction_keyword, parse_ret }
,{ &shr_instruction_keyword, parse_shr }
,{ &shl_instruction_keyword, parse_shl }
,{ &rcr_instruction_keyword, parse_rcr }
,{ &rcl_instruction_keyword, parse_rcl }
,{ &sal_instruction_keyword, parse_sal }
,{ &sar_instruction_keyword, parse_sar }
,{ &rol_instruction_keyword, parse_rol }
,{ &ror_instruction_keyword, parse_ror }
,{ &not_instruction_keyword, parse_not }
,{ &iret_instruction_keyword, parse_iret }
,{ &nop_instruction_keyword, parse_nop }
,{ &int_instruction_keyword, parse_int }
,{ &lea_instruction_keyword, parse_lea }
,{ &inc_instruction_keyword, parse_inc }
,{ &dec_instruction_keyword, parse_dec }
,{ &cmp_instruction_keyword, parse_cmp }
,{ &cli_instruction_keyword, parse_cli }
,{ &sti_instruction_keyword, parse_sti }
,{ &al_register_keyword, NULL }
,{ &bl_register_keyword, NULL }
,{ &cl_register_keyword, NULL }
,{ &dl_register_keyword, NULL }
,{ &sp_register_keyword, NULL }
,{ &bp_register_keyword, NULL }
,{ &si_register_keyword, NULL }
,{ &di_register_keyword, NULL }
,{ &cs_register_keyword, NULL }
,{ &ds_register_keyword, NULL }
,{ &ss_register_keyword, NULL }
,{ &es_register_keyword, NULL }
,{ &al_register_indirect_keyword, NULL }
,{ &bl_register_indirect_keyword, NULL }
,{ &cl_register_indirect_keyword, NULL }
,{ &dl_register_indirect_keyword, NULL }
,{ &sp_register_indirect_keyword, NULL }
,{ &bp_register_indirect_keyword, NULL }
,{ &si_register_indirect_keyword, NULL }
,{ &di_register_indirect_keyword, NULL }
,{ &cs_register_indirect_keyword, NULL }
,{ &ds_register_indirect_keyword, NULL }
,{ &ss_register_indirect_keyword, NULL }
,{ &es_register_indirect_keyword, NULL }
};
// 判断是否是一个关键字。返回0,不是关键字;返回非0,是关键字,并且返回值就是关键字在表中的下标。
int match_keyword(const char* token)
{
int i;
for (i = 1; i < sizeof(keyword_function_table) / sizeof(keyword_function_table[0]); i++)
{
if (stricmp(token, *keyword_function_table[i].keyword) == 0)
{
return i;
}
}
return 0;
}
// 判断是否是一个符号
int is_symbol(const char* token, int line_num)
{
int i;
char symbol_name[MAX_SYMBOL_LENGTH];
// 最后一个字符必须是冒号
if (token[strlen(token) - 1] != ':')
{
return 0;
}
// 第一个字符必须是字母或者下划线
if (token[0] != '_' && !isalpha(token[0]))
{
return 0;
}
// 后面的字符必须是字母、数字、下划线
for (i = 0; i < (int)strlen(token) - 2; i++)
{
if (token[i] != '_' && !isalpha(token[i]) && !isdigit(token[i]))
{
return 0;
}
}
// 不能与关键字相同
strcpy(symbol_name, token);
symbol_name[strlen(symbol_name) - 1] = 0;
if (match_keyword(symbol_name) != 0)
{
error_msg_keyword_symbol(symbol_name, line_num);
}
return 1;
}
// 判断是否是一个中断向量
int is_int_vector(const char* token, int line_num)
{
int i;
char vector_name[MAX_SYMBOL_LENGTH];
// 第一个字符必须是字母或者下划线
if (token[0] != '_' && !isalpha(token[0]))
{
return 0;
}
// 后面的字符必须是字母、数字、下划线
for (i = 0; i < (int)strlen(token) - 2; i++)
{
if (token[i] != '_' && !isalpha(token[i]) && !isdigit(token[i]))
{
return 0;
}
}
// 不能与关键字相同
strcpy(vector_name, token);
if (match_keyword(vector_name) != 0)
{
error_msg_keyword_int_vector(vector_name, line_num);
}
return 1;
}
// 输出版本信息
void version_msg()
{
printf(
"Engintime 8086汇编器 [版本 2.0]\n"
"版权所有 (c) 2008-2018 北京英真时代科技有限公司。保留所有权利。\n"
);
}
// 输出帮助信息
void help_msg()
{
printf(
"Engintime 8086汇编器。\n\n"
"用法:\n\n"
" dmasm.exe assembly_file_name [options]\n\n"
"选项:\n\n"
" -g debug_file_name\t指定生成的调试信息文件路径。\n"
" -h\t\t\t打印此帮助信息。\n"
" -l list_file_name\t指定生成的列表文件路径。\n"
" -o target_file_name\t指定生成的目标文件路径。若未指定,默认生成 a.obj 文件。\n"
" -v\t\t\t打印版本信息。\n"
);
printf("\n");
version_msg();
exit(1);
}
void argument_error_msg()
{
printf("命令行参数错误。\n\n");
help_msg();
}
// 处理器用户输入的命令行参数
void process_argument(int argc, char* argv[])
{
int i;
// argv[0] 是 "easm.exe",所以可以忽略。
for (i = 1; i < argc; i++)
{
if (strcmp(argv[i], "-v") == 0)
{
version_msg();
exit(1);
}
else if (strcmp(argv[i], "-h") == 0)
{
help_msg();
}
else if (strcmp(argv[i], "-o") == 0)
{
if (i + 1 < argc)
{
i++;
target_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
else if (strcmp(argv[i], "-l") == 0)
{
if (i + 1 < argc)
{
i++;
list_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
else if (strcmp(argv[i], "-g") == 0)
{
if (i + 1 < argc)
{
i++;
dbg_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
else if (NULL == assembly_file_name && argv[i][0] != '-')
{
// 输入的汇编源代码文件路径。
assembly_file_name = argv[i];
}
else
{
argument_error_msg();
}
}
//
// 如果命令行参数中没有指定输入的汇编文件,就打印错误信息后退出
//
if (NULL == assembly_file_name)
{
printf("命令行参数错误。没有指定汇编源代码文件的路径。\n");
help_msg();
}
}
// 将一个字符串写入二进制文件中。先将字符串长度写入文件,然后将字符串中的
// 每个字符依次写入文件,不包括字符串末尾的 0.
void write_string_to_binary_file(const char* str, FILE* fp)
{
int str_length;
if (str != NULL)
{
str_length = strlen(str);
fwrite(&str_length, 1, sizeof(str_length), fp);
fwrite(str, 1, str_length, fp);
}
else
{
str_length = 0;
fwrite(&str_length, 1, sizeof(str_length), fp);
}
}
int main(int argc, char* argv[])
{
FILE* fp;
char* token;
char line[MAX_LINE_LENGTH];
int i, j;
int line_num = 1; // 行号从第一行开始计数
int keyword_index;
//
// 处理命令行参数
//
process_argument(argc, argv);
//
// 打开汇编源代码文件
//
fp = fopen(assembly_file_name, "r");
if (NULL == fp)
{
printf("无法打开源代码文件 %s\n", assembly_file_name);
return 1;
}
//////////////////////////////////////////////////////////////////////////
// 第一遍扫描
version_msg();
printf("\n正在汇编 %s...\n", assembly_file_name);
//
// 一次读取一行文本,同时记录所有的代码行信息
//
while (fgets(line, sizeof(line), fp) != NULL)
{
//
// 将一行代码的信息记录到代码行数据库中
//
strcpy(line_database[line_count].line_string, line);
line_database[line_count].line_num = line_num;
line_database[line_count].address = machine_code_address;
//
// 将代码行中的注释剥离
//
line[strcspn(line, ";")] = 0;
//
// 开始解析代码行
//
token = strtok(line, delimit_char);
if (NULL == token)
{
// 如果是空行,不做任何处理
}
else if ((keyword_index = match_keyword(token)) != 0
&& keyword_function_table[keyword_index].parse_function != NULL)
{
// 根据关键字进行相应的处理
keyword_function_table[keyword_index].parse_function(line_num);
}
else if (is_int_vector(token, line_num))
{
// 必须首先判断是否是中断向量,然后再判断是否是标号。因为判断标号的时候会删除最后一个标志字符“:”,而中断向量名称后是没有冒号的
// 中断向量
parse_int_vector(token, line_num);
// 判断符号
if (is_symbol(token, line_num))
{
// 处理符号
parse_symbol(token, line_num);
}
}
else
{
error_msg("无法识别的代码行。", line_num);
}
//
// 补充代码行数据库信息
//
line_database[line_count].machine_code_count = machine_code_address - machine_code_old_address;
machine_code_old_address = machine_code_address;
//
// 检查机器码地址是否超过了最大地址,若超过则报错(一个地址单元存储一个字节机器码)
//
//
if (MAX_MACHINE_CODE_BYTE_COUNT == machine_code_address)
{
sprintf(formated_msg, "汇编代码的机器码过多,最多只能有 %d 个字节机器码。", MAX_MACHINE_CODE_BYTE_COUNT);
error_msg(formated_msg, -1);
}
//
// 记录产生了机器码的代码行数量
//
if (line_database[line_count].machine_code_count != 0)
{
machine_code_line_count++;
}
//
// 增加行号
//
line_count++;
line_num++;
if (line_count == MAX_LINE_COUNT)
{
sprintf(formated_msg, "汇编文件中的代码行过多,最多只能有 %d 行代码。", MAX_LINE_COUNT);
error_msg(formated_msg, -1);
}
}
fclose(fp);
//////////////////////////////////////////////////////////////////////////
// 第二遍扫描
//
// 根据符号表更新重定位表
//
for (i = 0; i < reallocate_count; i++)
{
for (j = 0; j < symbol_count; j++)
{
if (stricmp(symbol_table[j].name, reallocate_table[i].symbol_name) == 0)
{
machine_code[reallocate_table[i].address] = (BYTE)symbol_table[j].address;
symbol_table[j].ref_count++;
break;
}
}
if (j == symbol_count)
{
// 重定位表中使用的符号在符号表中未定义,报错
sprintf(formated_msg, "使用了未定义的符号 %s。", reallocate_table[i].symbol_name);
error_msg(formated_msg, reallocate_table[i].line_num);
}
}
//
// 如果存在未引用的符号,输出警告信息。
//
for (i = 0; i < symbol_count; i++)
{
if (0 == symbol_table[i].ref_count)
{
warning_msg_unref_symbol(symbol_table[i].name, symbol_table[i].line_num);
}
}
//////////////////////////////////////////////////////////////////////////
// 产生各种输出文件
//
// 将机器码写入二进制文件
//
if (NULL == target_file_name)
{
target_file_name = "a.obj";
}
fp = fopen(target_file_name, "wb");
if (NULL == fp)
{
printf("无法打开输出文件 %s\n", target_file_name);
return 1;
}
fwrite(machine_code, 1, machine_code_address, fp);
fclose(fp);
printf("\n生成目标文件 %s\n", target_file_name);
//
// 将代码行数据库中的信息写入列表文件
//
if (list_file_name != NULL)
{
fp = fopen(list_file_name, "w");
if (NULL == fp)
{
printf("无法打开列表文件 %s\n", list_file_name);
return 1;
}
for (i = 0; i < line_count; i++)
{
// 行号
fprintf(fp, "%04d ", line_database[i].line_num);
// 地址和机器码
if (line_database[i].machine_code_count > 0)
{
fprintf(fp, "%02X ", line_database[i].address);
for (j = 0; j < line_database[i].machine_code_count; j++)
{
// 确保每行最多写三个字节的机器码
if (j != 0 && j % 3 == 0)
{
if (3 == j)
{
fprintf(fp, " ");
}
else
{
fprintf(fp, "\n ");
}
}
fprintf(fp, "%02X ", machine_code[line_database[i].address + j]);
if (2 == j)
{
fprintf(fp, " ");
fprintf(fp, line_database[i].line_string);
}
}
if (1 == j)
{
// 单字节指令
fprintf(fp, " ");
fprintf(fp, line_database[i].line_string);
}
else if (2 == j)
{
fprintf(fp, " ");
fprintf(fp, line_database[i].line_string);
}
else if (j > 3)
{
fprintf(fp, "\n");
}
}
else
{
fprintf(fp, " ");
// 源代码
fprintf(fp, line_database[i].line_string);
}
}
fclose(fp);
printf("生成列表文件 %s\n", list_file_name);
}
//
// 将代码行数据库中的信息写入二进制的调试信息文件。
//
// 调试信息的基本格式为:
// 魔数(4字节),固定不可改变
// 版本号(4字节),固定不可改变
// 源代码文件绝对路径字符串长度(4字节)
// 源代码文件绝对路径字符串(不包括字符串结尾的0)
// 列表文件绝对路径字符串长度(4字节)
// 列表文件绝对路径字符串(不包括字符串结尾的0)
//
// 代码行数据库中元素的数量(4字节)
// 代码行数据库中的所有元素
//
// 符号表元素的数量(4字节)
// 符号表中的所有元素
//
if (dbg_file_name != NULL)
{
fp = fopen(dbg_file_name, "wb");
if (NULL == fp)
{
printf("无法打开调试信息文件 %s\n", dbg_file_name);
return 1;
}
// 魔数
fwrite(&dbg_file_magic, 1, sizeof(dbg_file_magic), fp);
// 版本号
fwrite(&dbg_file_version, 1, sizeof(dbg_file_version), fp);
// 源代码文件路径
write_string_to_binary_file(assembly_file_name, fp);
// 列表文件路径
write_string_to_binary_file(list_file_name, fp);
// 代码行数据库中的所有元素
fwrite(&machine_code_line_count, 1, sizeof(machine_code_line_count), fp);
for (i = 0; i < line_count; i++)
{
// 跳过没有产生机器码的代码行
if (0 == line_database[i].machine_code_count)
{
continue;
}
fwrite(&line_database[i].line_num, 1, sizeof(unsigned long), fp);
fwrite(&line_database[i].address, 1, sizeof(unsigned long), fp);
fwrite(&line_database[i].machine_code_count, 1, sizeof(unsigned long), fp);
fwrite(&line_database[i].flag, 1, sizeof(unsigned long), fp);
}
// 符号表中的所有元素
fwrite(&symbol_count, 1, sizeof(symbol_count), fp);
for (i = 0; i < symbol_count; i++)
{
write_string_to_binary_file(symbol_table[i].name, fp);
fwrite(&symbol_table[i].address, 1, sizeof(unsigned long), fp);
fwrite(&symbol_table[i].machine_code_count, 1, sizeof(int), fp);
fwrite(&symbol_table[i].line_num, 1, sizeof(int), fp);
}
fclose(fp);
printf("生成调试信息文件 %s\n", dbg_file_name);
}
return 0;
}
添加文件
;test
.text
BEGIN:
mov al, 0x1a
UP:
out 2, al
inc al
cmp al, 0x84
jnz UP
dec al
DOWN:
out 2, al
dec al
cmp al, 0x19
jnz DOWN
jmp BEGIN
@echo off
dmasm.exe ram.asm -o ram.rxm -l ram.lst -g ram.dbg
pause
添加文件
0001 ;test
0002 .text
0003
0004 BEGIN:
0005 10 01 00 1A mov al, 0x1a
0006
0007 UP:
0008 13 4E 00 02 out 2, al
0009 16 78 00 inc al
0010 18 47 00 84 cmp al, 0x84
0011 1B 55 13 jnz UP
0012 1D 79 00 dec al
0013
0014 DOWN:
0015 1F 4E 00 02 out 2, al
0016 22 79 00 dec al
0017 24 47 00 19 cmp al, 0x19
0018 27 55 1F jnz DOWN
0019 29 57 10 jmp BEGIN
0020
0021
0022
添加文件
添加文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="4894" version="1.1" width="12260" xmlns="http://www.w3.org/2000/svg">
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="200" font-weight="700" text-anchor="start" x="753" y="4608">DBUS[7..0]</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="200" font-weight="700" text-anchor="start" x="783" y="1838">ABUS[7..0]</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4913" y="778">CLK</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4213" x2="4313" y1="478" y2="478"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="4113" y="428"/>
<polyline fill="none" points="4123 378, 4203 378" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4163 378, 4163 428" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4133 508, 4163 508, 4163 448, 4193 448" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="180" font-weight="700" text-anchor="start" x="3733" y="365">CLOCK</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4023" y="488">SCLK</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="180" font-weight="400" text-anchor="start" x="3783" y="798">Key = C</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3083" y="478">RESET</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="2983" x2="3083" y1="478" y2="478"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="2883" y="428"/>
<polyline fill="none" points="2893 378, 2973 378" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2933 378, 2933 428" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="2903 508, 2933 508, 2933 448, 2963 448" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="180" font-weight="700" text-anchor="start" x="2663" y="355">RESET</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="2793" y="488">SCLK</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="180" font-weight="400" text-anchor="start" x="2633" y="778">Key = R</text>
<polyline fill="none" points="5543 418, 5543 4848" stroke="#000000" stroke-dasharray="200,100" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<rect fill="#80ff80" height="1700" stroke="#800000" stroke-width="1" width="700" x="3943" y="2308"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="250" font-weight="700" text-anchor="start" x="3943" y="2208">8086</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3943" y="2258">8086\8086.dlsche</text>
<polygon fill="#ffff80" points="3943 2408, 3968 2383, 4018 2383, 4043 2408, 4018 2433, 3968 2433, 3943 2408" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="2408">CLK</text>
<polygon fill="#ffff80" points="3943 2508, 3968 2483, 4018 2483, 4043 2508, 4018 2533, 3968 2533, 3943 2508" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="2508">RESET</text>
<polygon fill="#ffff80" points="3943 2608, 3968 2583, 4018 2583, 4043 2608, 4018 2633, 3968 2633, 3943 2608" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="2608">INTR</text>
<polygon fill="#ffff80" points="3943 2708, 3968 2683, 4018 2683, 4043 2708, 4018 2733, 3968 2733, 3943 2708" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="2708">READY</text>
<polygon fill="#ffff80" points="3943 2808, 3968 2783, 4018 2783, 4043 2808, 4018 2833, 3968 2833, 3943 2808" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="2808">HOLD</text>
<polygon fill="#ffff80" points="3943 2908, 3968 2883, 4018 2883, 4043 2908, 4018 2933, 3968 2933, 3943 2908" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="2908">NMI</text>
<polygon fill="#ffff80" points="3943 3008, 3968 2983, 4018 2983, 4043 3008, 4018 3033, 3968 3033, 3943 3008" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3008">TESET</text>
<polygon fill="#ffff80" points="3943 3108, 3968 3083, 4018 3083, 4043 3108, 4018 3133, 3968 3133, 3943 3108" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3108">D0</text>
<polygon fill="#ffff80" points="3943 3208, 3968 3183, 4018 3183, 4043 3208, 4018 3233, 3968 3233, 3943 3208" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3208">D1</text>
<polygon fill="#ffff80" points="3943 3308, 3968 3283, 4018 3283, 4043 3308, 4018 3333, 3968 3333, 3943 3308" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3308">D2</text>
<polygon fill="#ffff80" points="3943 3408, 3968 3383, 4018 3383, 4043 3408, 4018 3433, 3968 3433, 3943 3408" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3408">D3</text>
<polygon fill="#ffff80" points="3943 3508, 3968 3483, 4018 3483, 4043 3508, 4018 3533, 3968 3533, 3943 3508" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3508">D4</text>
<polygon fill="#ffff80" points="3943 3608, 3968 3583, 4018 3583, 4043 3608, 4018 3633, 3968 3633, 3943 3608" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3608">D5</text>
<polygon fill="#ffff80" points="3943 3708, 3968 3683, 4018 3683, 4043 3708, 4018 3733, 3968 3733, 3943 3708" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3708">D6</text>
<polygon fill="#ffff80" points="3943 3808, 3968 3783, 4018 3783, 4043 3808, 4018 3833, 3968 3833, 3943 3808" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4053" y="3808">D7</text>
<polygon fill="#ffff80" points="4643 2408, 4618 2383, 4568 2383, 4543 2408, 4568 2433, 4618 2433, 4643 2408" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="2408">A0</text>
<polygon fill="#ffff80" points="4643 2508, 4618 2483, 4568 2483, 4543 2508, 4568 2533, 4618 2533, 4643 2508" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="2508">A1</text>
<polygon fill="#ffff80" points="4643 2608, 4618 2583, 4568 2583, 4543 2608, 4568 2633, 4618 2633, 4643 2608" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="2608">A2</text>
<polygon fill="#ffff80" points="4643 2708, 4618 2683, 4568 2683, 4543 2708, 4568 2733, 4618 2733, 4643 2708" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="2708">A3</text>
<polygon fill="#ffff80" points="4643 2808, 4618 2783, 4568 2783, 4543 2808, 4568 2833, 4618 2833, 4643 2808" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="2808">A4</text>
<polygon fill="#ffff80" points="4643 2908, 4618 2883, 4568 2883, 4543 2908, 4568 2933, 4618 2933, 4643 2908" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="2908">A5</text>
<polygon fill="#ffff80" points="4643 3008, 4618 2983, 4568 2983, 4543 3008, 4568 3033, 4618 3033, 4643 3008" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3008">A6</text>
<polygon fill="#ffff80" points="4643 3108, 4618 3083, 4568 3083, 4543 3108, 4568 3133, 4618 3133, 4643 3108" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3108">A7</text>
<polygon fill="#ffff80" points="4643 3208, 4618 3183, 4568 3183, 4543 3208, 4568 3233, 4618 3233, 4643 3208" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4413" y="3208">WR_OUT</text>
<polygon fill="#ffff80" points="4643 3308, 4618 3283, 4568 3283, 4543 3308, 4568 3333, 4618 3333, 4643 3308" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4413" y="3308">READ_OUT</text>
<polygon fill="#ffff80" points="4643 3408, 4618 3383, 4568 3383, 4543 3408, 4568 3433, 4618 3433, 4643 3408" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3408">MIO</text>
<polygon fill="#ffff80" points="4643 3508, 4618 3483, 4568 3483, 4543 3508, 4568 3533, 4618 3533, 4643 3508" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3508">INTA</text>
<polygon fill="#ffff80" points="4643 3608, 4618 3583, 4568 3583, 4543 3608, 4568 3633, 4618 3633, 4643 3608" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3608">HLDA</text>
<polygon fill="#ffff80" points="4643 3708, 4618 3683, 4568 3683, 4543 3708, 4568 3733, 4618 3733, 4643 3708" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3708">ALE</text>
<polygon fill="#ffff80" points="4643 3808, 4618 3783, 4568 3783, 4543 3808, 4568 3833, 4618 3833, 4643 3808" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3808">DEN</text>
<polygon fill="#ffff80" points="4643 3908, 4618 3883, 4568 3883, 4543 3908, 4568 3933, 4618 3933, 4643 3908" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4433" y="3908">DTR</text>
<polyline fill="none" points="3943 3108, 3593 3108" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3943 3808, 3593 3808" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3858" y2="3808"/>
<polyline fill="none" points="3593 3208, 3943 3208" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3593 3308, 3943 3308" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3593 3408, 3943 3408" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3593 3508, 3943 3508" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3593 3608, 3943 3608" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3593 3708, 3943 3708" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3758" y2="3708"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3658" y2="3608"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3558" y2="3508"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3458" y2="3408"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3358" y2="3308"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3258" y2="3208"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="3543" x2="3593" y1="3158" y2="3108"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3108">DBUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3208">DBUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3308">DBUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3408">DBUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3508">DBUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3608">DBUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3708">DBUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="3593" y="3808">DBUS7</text>
<polyline fill="none" points="4633 2408, 4883 2408" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4643 2508, 4893 2508" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4643 2608, 4893 2608" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4643 2708, 4893 2708" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4643 2808, 4893 2808" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4643 2908, 4893 2908" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4643 3008, 4893 3008" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4643 3108, 4893 3108" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4883" x2="4933" y1="2408" y2="2358"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4893" x2="4943" y1="2508" y2="2458"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4893" x2="4943" y1="2608" y2="2558"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4893" x2="4943" y1="2708" y2="2658"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4893" x2="4943" y1="2808" y2="2758"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4893" x2="4943" y1="2908" y2="2858"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4893" x2="4943" y1="3008" y2="2958"/>
<line stroke="#000080" stroke-linecap="round" stroke-width="5" x1="4893" x2="4943" y1="3108" y2="3058"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4733" y="2408">ABUS0</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4743" y="2508">ABUS1</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4743" y="2608">ABUS2</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4743" y="2708">ABUS3</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4743" y="2808">ABUS4</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4743" y="2908">ABUS5</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4743" y="3008">ABUS6</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4743" y="3108">ABUS7</text>
<polyline fill="none" points="243 1838, 5013 1838, 9233 1838, 12213 1838" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4313" x2="4413" y1="1378" y2="1378"/>
<rect fill="#ffffb0" height="100" stroke="#800000" stroke-width="5" width="100" x="4213" y="1328"/>
<polyline fill="none" points="4223 1388, 4233 1388, 4233 1358, 4253 1358, 4253 1388, 4273 1388, 4273 1358, 4293 1358, 4293 1388" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4253" y="1318">C1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4209" y="1474">CLOCK11</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4353" y="1358">100Hz</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4213" x2="4313" y1="928" y2="928"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="30" font-weight="400" text-anchor="start" x="4154" y="948">1</text>
<rect fill="#ffffff" fill-opacity="0.5" height="60" stroke="#800000" stroke-width="5" width="100" x="4113" y="898"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4157" y="889">2</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4044" y="950">DCT</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4114" y="1001">Key = 1</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4773" x2="4713" y1="778" y2="778"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4853" x2="4913" y1="778" y2="778"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4813" x2="4813" y1="818" y2="878"/>
<circle cx="4813" cy="810" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="4773 728, 4773 828, 4853 778, 4773 728" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4823" y="698">U3</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4773" y="728">NBUFFER</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4773" x2="4713" y1="1078" y2="1078"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4853" x2="4913" y1="1078" y2="1078"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4813" x2="4813" y1="1118" y2="1178"/>
<circle cx="4813" cy="1110" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="4773 1028, 4773 1128, 4853 1078, 4773 1028" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4823" y="998">U4</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4773" y="1028">NBUFFER</text>
<polyline fill="none" points="4313 478, 4713 478, 4713 778" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4413 1378, 4713 1378, 4713 1078" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4313 928, 4813 928, 4813 878" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4513" x2="4513" y1="1038" y2="978"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="4513" x2="4513" y1="1118" y2="1178"/>
<circle cx="4513" cy="1114" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="4563 1038, 4463 1038, 4513 1108, 4563 1038" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" transform="rotate(90 4549 1058)" x="4549" y="1058">U5</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" transform="rotate(90 4417 1038)" x="4417" y="1038">NOT</text>
<polyline fill="none" points="4513 978, 4513 928" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4513 1178, 4813 1178" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="4913 778, 5013 778, 5013 1078, 4913 1078" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="10953" y="1408">in0</text>
<polyline fill="none" points="43 4608, 12153 4608" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<rect fill="#80ff80" height="600" stroke="#800000" stroke-width="1" width="700" x="6243" y="3408"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="250" font-weight="700" text-anchor="start" x="6243" y="3308">MEM</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6243" y="3358">MEM\MEM.dlsche</text>
<polygon fill="#ffff80" points="6243 3508, 6268 3483, 6318 3483, 6343 3508, 6318 3533, 6268 3533, 6243 3508" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6353" y="3508">WR_OUT</text>
<polygon fill="#ffff80" points="6243 3608, 6268 3583, 6318 3583, 6343 3608, 6318 3633, 6268 3633, 6243 3608" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6353" y="3608">CLK</text>
<polygon fill="#ffff80" points="6243 3708, 6268 3683, 6318 3683, 6343 3708, 6318 3733, 6268 3733, 6243 3708" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6353" y="3708">MIO</text>
<polygon fill="#ffff80" points="6243 3808, 6268 3783, 6318 3783, 6343 3808, 6318 3833, 6268 3833, 6243 3808" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6353" y="3808">READ_OUT</text>
<polygon fill="#ffff80" points="6243 3908, 6268 3883, 6318 3883, 6343 3908, 6318 3933, 6268 3933, 6243 3908" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6353" y="3908">ABUS[7..0]</text>
<polygon fill="#ffff80" points="6943 3508, 6918 3483, 6868 3483, 6843 3508, 6868 3533, 6918 3533, 6943 3508" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6733" y="3508">DBUS[7..0]</text>
<polyline fill="none" points="4943 3058, 4943 1838" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<polyline fill="none" points="6243 3908, 6043 3908, 6043 1838" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<polyline fill="none" points="8143 3408, 7943 3408, 7943 1838" stroke="#ff8057" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<polyline fill="none" points="3543 3158, 3543 4608" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<polyline fill="none" points="6943 3508, 7143 3508, 7143 4608" stroke="#000080" stroke-linecap="round" stroke-linejoin="round" stroke-width="50"/>
<rect fill="#80ff80" height="1100" stroke="#800000" stroke-width="1" width="700" x="8143" y="2908"/>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="250" font-weight="700" text-anchor="start" x="8143" y="2808">IO</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8143" y="2858">IO\IO.dlsche</text>
<polygon fill="#ffff80" points="8143 3008, 8168 2983, 8218 2983, 8243 3008, 8218 3033, 8168 3033, 8143 3008" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8253" y="3008">MIO</text>
<polygon fill="#ffff80" points="8143 3108, 8168 3083, 8218 3083, 8243 3108, 8218 3133, 8168 3133, 8143 3108" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8253" y="3108">WR_OUT</text>
<polygon fill="#ffff80" points="8143 3208, 8168 3183, 8218 3183, 8243 3208, 8218 3233, 8168 3233, 8143 3208" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8253" y="3208">READ_OUT</text>
<polygon fill="#ffff80" points="8143 3308, 8168 3283, 8218 3283, 8243 3308, 8218 3333, 8168 3333, 8143 3308" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8253" y="3308">MIO</text>
<polygon fill="#ffff80" points="8143 3408, 8168 3383, 8218 3383, 8243 3408, 8218 3433, 8168 3433, 8143 3408" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8253" y="3408">A[7..0]</text>
<polygon fill="#ffff80" points="8843 3008, 8818 2983, 8768 2983, 8743 3008, 8768 3033, 8818 3033, 8843 3008" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3008">IOW</text>
<polygon fill="#ffff80" points="8843 3108, 8818 3083, 8768 3083, 8743 3108, 8768 3133, 8818 3133, 8843 3108" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3108">IOR</text>
<polygon fill="#ffff80" points="8843 3208, 8818 3183, 8768 3183, 8743 3208, 8768 3233, 8818 3233, 8843 3208" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3208">CS0</text>
<polygon fill="#ffff80" points="8843 3308, 8818 3283, 8768 3283, 8743 3308, 8768 3333, 8818 3333, 8843 3308" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3308">CS1</text>
<polygon fill="#ffff80" points="8843 3408, 8818 3383, 8768 3383, 8743 3408, 8768 3433, 8818 3433, 8843 3408" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3408">CS2</text>
<polygon fill="#ffff80" points="8843 3508, 8818 3483, 8768 3483, 8743 3508, 8768 3533, 8818 3533, 8843 3508" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3508">CS3</text>
<polygon fill="#ffff80" points="8843 3608, 8818 3583, 8768 3583, 8743 3608, 8768 3633, 8818 3633, 8843 3608" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3608">CS4</text>
<polygon fill="#ffff80" points="8843 3708, 8818 3683, 8768 3683, 8743 3708, 8768 3733, 8818 3733, 8843 3708" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3708">CS5</text>
<polygon fill="#ffff80" points="8843 3808, 8818 3783, 8768 3783, 8743 3808, 8768 3833, 8818 3833, 8843 3808" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3808">CS6</text>
<polygon fill="#ffff80" points="8843 3908, 8818 3883, 8768 3883, 8743 3908, 8768 3933, 8818 3933, 8843 3908" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="8633" y="3908">CS7</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="微软雅黑" font-size="500" font-weight="700" text-anchor="start" x="6443" y="608">8086微机系统</text>
<circle cx="4513" cy="928" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="7143" cy="4608" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="3543" cy="4608" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="7943" cy="1838" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="6043" cy="1838" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
<circle cx="4943" cy="1838" fill="#000080" r="25" stroke="#000080" stroke-width="5"/>
</svg>
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论