Files
oldlinux-website/Book-Lite/code-list/html/P10-4.html
2024-02-19 01:11:57 -05:00

2547 lines
87 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<meta name=Generator content="Microsoft Word 14 (filtered)">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:方正小标宋简体;}
@font-face
{font-family:"\@黑体";
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"\@方正小标宋简体";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
h1
{mso-style-link:"标题 1 Char";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:7.2pt;
text-align:center;
text-indent:-7.2pt;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
h2
{mso-style-link:"标题 2 Char";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
text-indent:0cm;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
h3
{mso-style-link:"标题 3 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:0cm;
page-break-after:avoid;
font-size:14.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
h4
{mso-style-link:"标题 4 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:28.8pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-28.8pt;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
h5
{mso-style-link:"标题 5 Char";
margin-top:14.0pt;
margin-right:0cm;
margin-bottom:14.5pt;
margin-left:36.0pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-36.0pt;
line-height:156%;
page-break-after:avoid;
font-size:14.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
h6
{mso-style-link:"标题 6 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:43.2pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-43.2pt;
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
{mso-style-link:"标题 7 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:50.4pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-50.4pt;
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
{mso-style-link:"标题 8 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:57.6pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-72.0pt;
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
{mso-style-link:"标题 9 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:64.8pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-79.2pt;
line-height:133%;
page-break-after:avoid;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.MsoIndex1, li.MsoIndex1, div.MsoIndex1
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:10.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:31.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:52.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:63.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:73.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:84.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:94.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc1, li.MsoToc1, div.MsoToc1
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoToc2, li.MsoToc2, div.MsoToc2
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc3, li.MsoToc3, div.MsoToc3
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc4, li.MsoToc4, div.MsoToc4
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:31.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc5, li.MsoToc5, div.MsoToc5
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc6, li.MsoToc6, div.MsoToc6
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:52.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc7, li.MsoToc7, div.MsoToc7
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:63.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc8, li.MsoToc8, div.MsoToc8
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:73.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc9, li.MsoToc9, div.MsoToc9
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:84.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
{mso-style-link:"脚注文本 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
{mso-style-link:"批注文字 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoHeader, li.MsoHeader, div.MsoHeader
{mso-style-link:"页眉 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
layout-grid-mode:char;
border:none;
padding:0cm;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoFooter, li.MsoFooter, div.MsoFooter
{mso-style-link:"页脚 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading
{mso-style-name:"索引标题\,索引类目\,索引类目1\,索引类目2";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoCaption, li.MsoCaption, div.MsoCaption
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.MsoTof, li.MsoTof, div.MsoTof
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.MsoFootnoteReference
{vertical-align:super;}
p.MsoList, li.MsoList, div.MsoList
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoList2, li.MsoList2, div.MsoList2
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoList4, li.MsoList4, div.MsoList4
{margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoDate, li.MsoDate, div.MsoDate
{mso-style-link:"日期 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:5.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
{mso-style-name:"超链接\,超级链接";
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
p
{mso-style-name:"普通\(网站\)\,普通 \(Web\)\,普通 \(Web\)1\,普通 \(Web\)2\,普通 \(Web\)3";
margin-right:0cm;
margin-left:0cm;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
pre
{mso-style-name:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
mso-style-link:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
tt
{font-family:;}
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
{mso-style-link:"批注主题 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
{mso-style-link:"批注框文本 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.1, li.1, div.1
{mso-style-name:1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.a, li.a, div.a
{mso-style-name:;
mso-style-link:"代码程序 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
span.Char
{mso-style-name:"代码程序 Char";
mso-style-link:;
font-family:;}
p.a0, li.a0, div.a0
{mso-style-name:;
mso-style-link:"图说明 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char0
{mso-style-name:"图说明 Char";
mso-style-link:;
font-family:;}
p.0, li.0, div.0
{mso-style-name:0;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.10, li.10, div.10
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.11, li.11, div.11
{mso-style-name:1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.a1, li.a1, div.a1
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3CharChar, li.3CharChar, div.3CharChar
{mso-style-name:"图中文字3 Char Char";
mso-style-link:"图中文字3 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharCharChar
{mso-style-name:"图中文字3 Char Char Char";
mso-style-link:"图中文字3 Char Char";
font-family:;}
p.post, li.post, div.post
{mso-style-name:post;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3, li.3, div.3
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.3CharChar1CharCharChar
{mso-style-name:"图中文字3 Char Char1 Char Char Char";
font-family:;}
span.3CharChar1CharChar
{mso-style-name:"图中文字3 Char Char1 Char Char";
font-family:;}
p.5Char, li.5Char, div.5Char
{mso-style-name:"图中文字5号 Char";
mso-style-link:"图中文字5号 Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.5CharChar
{mso-style-name:"图中文字5号 Char Char";
mso-style-link:"图中文字5号 Char";
font-family:;}
p.5CharChar0, li.5CharChar0, div.5CharChar0
{mso-style-name:"图中文字小5号 Char Char";
mso-style-link:"图中文字小5号 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
span.5CharCharChar
{mso-style-name:"图中文字小5号 Char Char Char";
mso-style-link:"图中文字小5号 Char Char";
font-family:;}
p.5Char0, li.5Char0, div.5Char0
{mso-style-name:"图中文字小5号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5, li.5, div.5
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.2, li.2, div.2
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
p.20, li.20, div.20
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.21, li.21, div.21
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char Char";
mso-style-link:"图中文字3 Char Char Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharCharCharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char Char Char";
mso-style-link:"图中文字3 Char Char Char Char Char";
font-family:;}
p.a2, li.a2, div.a2
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.110, li.110, div.110
{mso-style-name:"样式 标题 1 + 居中1";
margin-right:0cm;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
span.1Char
{mso-style-name:"标题 1 Char";
mso-style-link:"标题 1";
font-weight:bold;}
p.22, li.22, div.22
{mso-style-name:"样式 列表 2 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.23, li.23, div.23
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.50, li.50, div.50
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.111, li.111, div.111
{mso-style-name:11;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.12, li.12, div.12
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
p.13, li.13, div.13
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.01, li.01, div.01
{mso-style-name:01;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.112, li.112, div.112
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.113, li.113, div.113
{mso-style-name:11;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.14, li.14, div.14
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3Char1, li.3Char1, div.3Char1
{mso-style-name:"图中文字3 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post1, li.post1, div.post1
{mso-style-name:post1;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.31, li.31, div.31
{mso-style-name:31;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char1, li.5Char1, div.5Char1
{mso-style-name:"图中文字5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5CharChar1, li.5CharChar1, div.5CharChar1
{mso-style-name:"图中文字小5号 Char Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5Char10, li.5Char10, div.5Char10
{mso-style-name:"图中文字小5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.51, li.51, div.51
{mso-style-name:51;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.120, li.120, div.120
{mso-style-name:12;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.02, li.02, div.02
{mso-style-name:02;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.121, li.121, div.121
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.122, li.122, div.122
{mso-style-name:12;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.3Char2, li.3Char2, div.3Char2
{mso-style-name:"图中文字3 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post2, li.post2, div.post2
{mso-style-name:post2;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.32, li.32, div.32
{mso-style-name:32;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char2, li.5Char2, div.5Char2
{mso-style-name:"图中文字小5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.52, li.52, div.52
{mso-style-name:52;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.130, li.130, div.130
{mso-style-name:13;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.30, li.30, div.30
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
p.03, li.03, div.03
{mso-style-name:03;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.131, li.131, div.131
{mso-style-name:13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.132, li.132, div.132
{mso-style-name:13;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.33, li.33, div.33
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3Char3, li.3Char3, div.3Char3
{mso-style-name:"图中文字3 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post3, li.post3, div.post3
{mso-style-name:post3;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.330, li.330, div.330
{mso-style-name:33;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char20, li.5Char20, div.5Char20
{mso-style-name:"图中文字5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5CharChar2, li.5CharChar2, div.5CharChar2
{mso-style-name:"图中文字小5号 Char Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5Char3, li.5Char3, div.5Char3
{mso-style-name:"图中文字小5号 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.53, li.53, div.53
{mso-style-name:53;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.3Char, li.3Char, div.3Char
{mso-style-name:"图中文字3 Char";
mso-style-link:"图中文字3 Char Char5";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharChar5
{mso-style-name:"图中文字3 Char Char5";
mso-style-link:"图中文字3 Char";
font-family:;}
p.54, li.54, div.54
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
line-height:9.0pt;
text-autospace:ideograph-numeric;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.24, li.24, div.24
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.15, li.15, div.15
{mso-style-name:"样式 标题 1 + 居中";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.25, li.25, div.25
{mso-style-name:"样式 标题 2 + 行距\: 单倍行距";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:28.9pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-28.9pt;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
span.2Char
{mso-style-name:"标题 2 Char";
mso-style-link:"标题 2";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.34, li.34, div.34
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.35, li.35, div.35
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.4, li.4, div.4
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.40, li.40, div.40
{mso-style-name:4;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.41, li.41, div.41
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.55, li.55, div.55
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.56, li.56, div.56
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.57, li.57, div.57
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.6, li.6, div.6
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.60, li.60, div.60
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.61, li.61, div.61
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.7, li.7, div.7
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.70, li.70, div.70
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.71, li.71, div.71
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.8, li.8, div.8
{mso-style-name:8;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.9, li.9, div.9
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.90, li.90, div.90
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.100, li.100, div.100
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.101, li.101, div.101
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.114, li.114, div.114
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.115, li.115, div.115
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.116, li.116, div.116
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.123, li.123, div.123
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.124, li.124, div.124
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.133, li.133, div.133
{mso-style-name:13;
mso-style-link:"图说明13 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.13Char
{mso-style-name:"图说明13 Char";
mso-style-link:13;
font-family:;}
p.134, li.134, div.134
{mso-style-name:13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.26, li.26, div.26
{mso-style-name:2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.36, li.36, div.36
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:14.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
span.3Char0
{mso-style-name:"标题 3 Char";
mso-style-link:"标题 3";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.16, li.16, div.16
{mso-style-name:1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.17, li.17, div.17
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.42, li.42, div.42
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
span.4Char
{mso-style-name:"标题 4 Char";
mso-style-link:"标题 4";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a3, li.a3, div.a3
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.27, li.27, div.27
{mso-style-name:2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:28.8pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-28.8pt;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a4, li.a4, div.a4
{mso-style-name:;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.18, li.18, div.18
{mso-style-name:1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.19, li.19, div.19
{mso-style-name:1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.1a, li.1a, div.1a
{mso-style-name:1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.37, li.37, div.37
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.62, li.62, div.62
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
layout-grid-mode:char;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.a5, li.a5, div.a5
{mso-style-name:;
mso-style-link:"正文代码 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char1
{mso-style-name:"正文代码 Char";
mso-style-link:;
font-family:;}
p.43, li.43, div.43
{mso-style-name:"样式 标题 4 +";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.140, li.140, div.140
{mso-style-name:14;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.141, li.141, div.141
{mso-style-name:14;
mso-style-link:"图说明14 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.14Char
{mso-style-name:"图说明14 Char";
mso-style-link:14;
font-family:;}
p.a6, li.a6, div.a6
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.a7, li.a7, div.a7
{mso-style-name:"样式 正文 +";
mso-style-link:"样式 正文 + Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char2
{mso-style-name:"样式 正文 + Char";
mso-style-link:"样式 正文 +";
font-family:"Times New Roman","serif";}
p.a8, li.a8, div.a8
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.a9, li.a9, div.a9
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.aa, li.aa, div.aa
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ab, li.ab, div.ab
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ac, li.ac, div.ac
{mso-style-name:;
margin-top:0cm;
margin-right:21.0pt;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
border:none;
padding:0cm;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.125, li.125, div.125
{mso-style-name:"样式 标题 1 + 居中2";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.ad, li.ad, div.ad
{mso-style-name:"样式 题注 + 宋体 五号 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.1b, li.1b, div.1b
{mso-style-name:1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
line-height:240%;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.38, li.38, div.38
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
font-family:;}
p.63, li.63, div.63
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.64, li.64, div.64
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.65, li.65, div.65
{mso-style-name:6;
mso-style-link:"图中文字6号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
span.6Char
{mso-style-name:"图中文字6号 Char";
mso-style-link:6;
font-family:;}
p.ae, li.ae, div.ae
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.28, li.28, div.28
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.af, li.af, div.af
{mso-style-name:;
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:0cm;
margin-left:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:14.0pt;
font-family:;}
p.1c, li.1c, div.1c
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:16.0pt;
font-family:"Times New Roman","serif";}
p.af0, li.af0, div.af0
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.af1, li.af1, div.af1
{mso-style-name:"样式 题注 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.ListTitle, li.ListTitle, div.ListTitle
{mso-style-name:ListTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.FigureTitle, li.FigureTitle, div.FigureTitle
{mso-style-name:FigureTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.TableTitle, li.TableTitle, div.TableTitle
{mso-style-name:TableTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.ProgramTitle, li.ProgramTitle, div.ProgramTitle
{mso-style-name:ProgramTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.RightText, li.RightText, div.RightText
{mso-style-name:RightText;
margin-top:0cm;
margin-right:21.0pt;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
border:none;
padding:0cm;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.af2, li.af2, div.af2
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.af3, li.af3, div.af3
{mso-style-name:;
mso-style-link:"关键词 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char3
{mso-style-name:"关键词 Char";
mso-style-link:;
font-family:;}
p.af4, li.af4, div.af4
{mso-style-name:;
mso-style-link:"文件名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char4
{mso-style-name:"文件名 Char";
mso-style-link:;
font-family:;}
p.af5, li.af5, div.af5
{mso-style-name:;
mso-style-link:"选项 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char5
{mso-style-name:"选项 Char";
mso-style-link:;
font-family:;}
p.af6, li.af6, div.af6
{mso-style-name:;
mso-style-link:"命令行 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char6
{mso-style-name:"命令行 Char";
mso-style-link:;
font-family:;}
p.af7, li.af7, div.af7
{mso-style-name:;
mso-style-link:"函数名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char7
{mso-style-name:"函数名 Char";
mso-style-link:;
font-family:;}
p.af8, li.af8, div.af8
{mso-style-name:;
mso-style-link:"寄存器名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char8
{mso-style-name:"寄存器名 Char";
mso-style-link:;
font-family:"Times New Roman","serif";}
p.af9, li.af9, div.af9
{mso-style-name:;
mso-style-link:"变量名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char9
{mso-style-name:"变量名 Char";
mso-style-link:;
font-family:;}
p.58, li.58, div.58
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.59, li.59, div.59
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.926, li.926, div.926
{mso-style-name:"样式 代码程序 + 左侧\: 9\.26 厘米";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:10.0pt;
font-family:;}
span.5Char4
{mso-style-name:"标题 5 Char";
mso-style-link:"标题 5";
font-weight:bold;}
span.6Char0
{mso-style-name:"标题 6 Char";
mso-style-link:"标题 6";
font-family:"Arial","sans-serif";
font-weight:bold;}
span.7Char
{mso-style-name:"标题 7 Char";
mso-style-link:"标题 7";
font-weight:bold;}
span.8Char
{mso-style-name:"标题 8 Char";
mso-style-link:"标题 8";
font-family:"Arial","sans-serif";}
span.9Char
{mso-style-name:"标题 9 Char";
mso-style-link:"标题 9";
font-family:"Arial","sans-serif";}
span.Chara
{mso-style-name:"脚注文本 Char";
mso-style-link:;
font-family:;}
span.Charb
{mso-style-name:"批注文字 Char";
mso-style-link:;
font-family:;}
span.Charc
{mso-style-name:"页眉 Char";
mso-style-link:;
font-family:;}
span.Chard
{mso-style-name:"页脚 Char";
mso-style-link:;
font-family:;}
span.Chare
{mso-style-name:"日期 Char";
mso-style-link:;
font-family:;}
span.HTMLChar
{mso-style-name:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
mso-style-link:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
font-family:;}
span.Charf
{mso-style-name:"批注主题 Char";
mso-style-link:;
font-family:;
font-weight:bold;}
span.Charf0
{mso-style-name:"批注框文本 Char";
mso-style-link:;
font-family:;}
.MsoChpDefault
{font-size:10.0pt;}
/* Page Definitions */
@page WordSection1
{size:595.3pt 841.9pt;
margin:72.0pt 54.0pt 72.0pt 54.0pt;
layout-grid:15.6pt;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style>
</head>
<body lang=ZH-CN link=blue vlink=purple style='text-justify-trim:punctuation'>
<div class=WordSection1 style='layout-grid:15.6pt'>
<p class=ab><a name="_Toc53320625"><span style='font-family:黑体'>程序</span><span
lang=EN-US>10-4 linux/kernel/chr_drv/rs_io.s</span></a></p>
<div class=a align=center style='text-align:center'><span lang=EN-US>
<hr size=4 width="100%" align=center>
</span></div>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>1</span></u> /*</span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>2</span></u>&nbsp;
*&nbsp; linux/kernel/rs_io.s</span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>3</span></u>&nbsp;
*</span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>4</span></u>&nbsp;
*&nbsp; (C) 1991&nbsp; Linus Torvalds</span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>5</span></u>&nbsp;
*/</span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>6</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>7</span></u> /*</span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>8</span></u>&nbsp;
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs_io.s</span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>9</span></u>&nbsp;
*</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>10</span></u>&nbsp;
* This module implements the rs232 io interrupts.</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>11</span></u>&nbsp;
*/</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /* </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>该模块实现<span
lang=EN-US>rs232</span>输入输出中断处理程序。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>12</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>13</span></u>
.text</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>14</span></u>
.globl _rs1_interrupt,_rs2_interrupt</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>15</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // size</span>是读写队列缓冲区的字节长度。该值必须是<span
lang=EN-US>2</span>的次方,并且必须与<span lang=EN-US>tty_io.c</span>中的匹配。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>16</span></u>
size&nbsp;&nbsp;&nbsp; =
1024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* must be power of two !</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>17</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
and must match the value</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span
style='color:blue'>18</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
in tty_io.c!!! */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>19</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>20</span></u> /*
these are the offsets into the read/write buffer structures */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /* </span>以下这些是读写缓冲队列结构中的偏移量<span
lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>对应 <span lang=EN-US>include/linux/tty.h
</span>文件中 <span lang=EN-US>tty_queue </span>结构中各字段的字节偏移量。其中<span lang=EN-US>rs_addr</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>对应<span lang=EN-US>tty_queue</span>结构的<span
lang=EN-US>data</span>字段。对于串行终端缓冲队列,该字段存放着串行端口基地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>21</span></u>
rs_addr = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>串行端口号字段偏移(端口是<span lang=EN-US>0x3f8</span><span
lang=EN-US>0x2f8</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>22</span></u>
head = 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>缓冲区中头指针字段偏移。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>23</span></u>
tail = 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>缓冲区中尾指针字段偏移。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>24</span></u>
proc_list = 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>等待该缓冲的进程字段偏移。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>25</span></u> buf
= 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>缓冲区字段偏移。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>26</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>当一个写缓冲队列满后,内核就会把要往写队列填字符的进程设置为等待状态。当写缓冲队列</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>中还剩余最多<span
lang=EN-US>256</span>个字符时,中断处理程序就可以唤醒这些等待进程继续往写队列中放字符。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>27</span></u>
startup = 256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*
chars left in write queue when we restart it */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* </span>当我们重新开始写时,队列里最多还剩余字符个数。<span lang=EN-US>*/</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>28</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>29</span></u> /*</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>30</span></u>&nbsp;
* These are the actual interrupt routines. They look where</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>31</span></u>&nbsp;
* the interrupt is coming from, and take appropriate action.</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>32</span></u>&nbsp;
*/</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /*</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>这些是实际的中断处理程序。程序首先检查中断的来源,然后执行</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>相应的处理。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// </span>串行端口<span
lang=EN-US>1</span>中断处理程序入口点。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>初始化时<span lang=EN-US>rs1_interrupt</span>地址被放入中断描述符<span
lang=EN-US>0x24</span>中,对应<span
lang=EN-US>8259A</span>的中断请求<span lang=EN-US>IRQ4</span>引脚。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>这里首先把<span lang=EN-US>tty</span>表中串行终端<span
lang=EN-US>1</span>(串口<span lang=EN-US>1</span>)读写缓冲队列指针的地址入栈(<span lang=EN-US>tty_io.c</span><span
lang=EN-US>81</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>然后跳转到<span lang=EN-US>rs_int</span>继续处理。这样做可以让串口<span
lang=EN-US>1</span>和串口<span lang=EN-US>2</span>的处理代码公用。字符缓冲队列</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>结构<span lang=EN-US>tty_queue</span>格式请参见<span
lang=EN-US>include/linux/tty.h</span>,第<span lang=EN-US>22</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>33</span></u>
.align 2</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>34</span></u>
_rs1_interrupt:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>35</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl $_table_list+8&nbsp;&nbsp;&nbsp; // tty</span>表中串口<span lang=EN-US>1</span>读写缓冲队列指针地址入栈。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>36</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
jmp rs_int</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>37</span></u>
.align 2</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// </span>串行端口<span
lang=EN-US>2</span>中断处理程序入口点。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>38</span></u>
_rs2_interrupt:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>39</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl $_table_list+16&nbsp;&nbsp; // tty</span>表中串口<span lang=EN-US>2</span>读写缓冲队列指针地址入栈。</p>
<p class=a><span lang=EN-US>&nbsp;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>这段代码首先让段寄存器<span
lang=EN-US>ds</span><span lang=EN-US>es</span>指向内核数据段,然后从对应读写缓冲队列<span
lang=EN-US>data</span>字段取出</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>串行端口基地址。该地址加<span
lang=EN-US>2</span>即是中断标识寄存器<span lang=EN-US>IIR</span>的端口地址。若位<span
lang=EN-US>0 = 0</span>,表示有需</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>要处理的中断。于是根据位<span
lang=EN-US>2</span>、位<span lang=EN-US>1</span>使用指针跳转表调用相应中断源类型处理子程序。在每</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>个子程序中会在处理完后复位<span
lang=EN-US>UART </span>的相应中断源。在子程序返回后这段代码会循环判断是</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>否还有其他中断源(位<span
lang=EN-US>0 = 0</span>?)。如果本次中断还有其他中断源,则<span lang=EN-US>IIR</span>的位<span
lang=EN-US>0</span>仍然是<span lang=EN-US>0</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>于是中断处理程序会再调用相应中断源子程序继续处理。直到引起本次中断的所有中断源都</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>被处理并复位,此时<span
lang=EN-US>UART</span>会自动地设置<span lang=EN-US>IIR</span>的位<span lang=EN-US>0 =1</span>,表示已无待处理的中断,于是中断</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>处理程序即可退出。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>40</span></u>
rs_int:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>41</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl %edx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>42</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl %ecx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>43</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl %ebx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>44</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl %eax</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>45</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
push %es</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>46</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
push
%ds&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* as this is an interrupt, we cannot */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>47</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl
$0x10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* know that bs is ok. Load it */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>48</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pop %ds&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* </span>由于这是一个中断程序,我们不知道<span lang=EN-US>ds</span>是否正确,<span lang=EN-US>*/</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>49</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl $0x10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* </span>所以加载它们(让<span lang=EN-US>ds</span><span lang=EN-US>es</span>指向内核数据段)<span
lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>50</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pop %es</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>51</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
movl 24(%esp),%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>取上面<span lang=EN-US>35</span><span
lang=EN-US>39</span>行入栈的相应串口缓冲队列指针地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>52</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
movl (%edx),%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>取读缓冲队列结构指针(地址)<span
lang=EN-US style='font-family:Wingdings'>è</span><span lang=EN-US>edx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>53</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
movl rs_addr(%edx),%edx // </span>取串口<span lang=EN-US>1</span>(或串口<span
lang=EN-US>2</span>)端口基地址<span lang=EN-US style='font-family:Wingdings'>è</span><span
lang=EN-US>edx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>54</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
addl $2,%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* interrupt ident. reg */ &nbsp;/* </span>指向中断标识寄存器<span lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// </span>中断标识寄存器端口地址是<span
lang=EN-US>0x3fa</span><span lang=EN-US>0x2fa</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>55</span></u>
rep_int:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>56</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
xorl %eax,%eax</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>57</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inb %dx,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>取中断标识字节,以判断中断来源(有<span lang=EN-US>4</span>种中断情况)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>58</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
testb $1,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>首先判断有无待处理中断(位<span lang=EN-US>0 = 0</span>有中断)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>59</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
jne end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>若无待处理中断,则跳转至退出处理处<span lang=EN-US>end</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>60</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cmpb
$6,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* this shouldn't happen, but ... */ /*</span>这不会发生,但<span lang=EN-US>…*/</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>61</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ja end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// al</span>值大于<span lang=EN-US>6</span>,则跳转至<span lang=EN-US>end</span>(没有这种状态)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>62</span></u>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movl 24(%esp),%ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>调用子程序之前把缓冲队列指针地址放入<span lang=EN-US>ecx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>63</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pushl %edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>临时保存中断标识寄存器端口地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>64</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
subl $2,%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// edx</span>中恢复串口基地址值<span lang=EN-US>0x3f8</span><span
lang=EN-US>0x2f8</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>65</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
call jmp_table(,%eax,2) /* NOTE! not *4, bit0 is 0 already */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>上面语句是指,当有待处理中断时,<span
lang=EN-US>al</span>中位<span lang=EN-US>0=0</span>,位<span lang=EN-US>2</span>、位<span
lang=EN-US>1</span>是中断类型,因此相当于已经将</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>中断类型乘了<span
lang=EN-US>2</span>,这里再乘<span lang=EN-US>2</span>,获得跳转表(第<span lang=EN-US>79</span>行)对应各中断类型地址,并跳转到那里去</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>作相应处理。中断来源有<span
lang=EN-US>4</span>种:<span lang=EN-US>modem</span>状态发生变化;要写(发送)字符;要读(接收)字符;</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>线路状态发生变化。允许发送字符中断通过设置发送保持寄存器标志实现。在<span
lang=EN-US>serial.c</span>程序</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>中,当写缓冲队列中有数据时,<span
lang=EN-US>rs_write()</span>函数就会修改中断允许寄存器内容,添加上发送保</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>持寄存器中断允许标志,从而在系统需要发送字符时引起串行中断发生。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>66</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
popl %edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>恢复中断标识寄存器端口地址<span lang=EN-US>0x3fa</span>(或<span lang=EN-US>0x2fa</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>67</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
jmp rep_int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>跳转,继续判断有无待处理中断并作相应处理。</p>
<p class=a><span lang=EN-US>&nbsp;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>68</span></u>
end:&nbsp;&nbsp;&nbsp; movb $0x20,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>中断退出处理。向中断控制器发送结束中断指令<span lang=EN-US>EOI</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>69</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
outb %al,$0x20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* EOI */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>70</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pop %ds</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>71</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
pop %es</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>72</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
popl %eax</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>73</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
popl %ebx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>74</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
popl %ecx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>75</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
popl %edx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>76</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
addl $4,%esp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
# jump over _table_list entry &nbsp;&nbsp;# </span>丢弃队列指针地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>77</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iret</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>78</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>各中断类型处理子程序地址跳转表,共有<span
lang=EN-US>4</span>种中断来源:</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // modem</span>状态变化中断,写字符中断,读字符中断,线路状态有问题中断。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>79</span></u>
jmp_table:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>80</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
.long modem_status,write_char,read_char,line_status</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>81</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>由于<span lang=EN-US>modem</span>状态发生变化而引发此次中断。通过读<span
lang=EN-US>modem</span>状态寄存器<span lang=EN-US>MSR</span>对其进行复位操作。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>82</span></u>
.align 2</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>83</span></u>
modem_status:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>84</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
addl $6,%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* clear intr by reading modem status reg */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>85</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inb %dx,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* </span>通过读<span lang=EN-US>modem</span>状态寄存器进行复位(<span lang=EN-US>0x3fe</span><span
lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>86</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ret</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>87</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>由于线路状态发生变化而引起这次串行中断。通过读线路状态寄存器<span
lang=EN-US>LSR</span>对其进行复位操作。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>88</span></u>
.align 2</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>89</span></u>
line_status:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>90</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
addl $5,%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* clear intr by reading line status reg. */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>91</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inb %dx,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* </span>通过读线路状态寄存器进行复位(<span lang=EN-US>0x3fd</span><span lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>92</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ret</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>93</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>由于<span lang=EN-US>UART</span>芯片接收到字符而引起这次中断。对接收缓冲寄存器执行读操作可复位该中断源。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>这个子程序将接收到的字符放到读缓冲队列<span
lang=EN-US>read_q</span>头指针(<span lang=EN-US>head</span>)处,并且让该指针前移一</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>个字符位置。若<span
lang=EN-US>head</span>指针已经到达缓冲区末端,则让其折返到缓冲区开始处。最后调用<span lang=EN-US>C</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>do_tty_interrupt()</span>(也即<span
lang=EN-US>copy_to_cooked()</span>),把读入的字符经过处理放入规范模式缓</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>冲队列(辅助缓冲队列<span
lang=EN-US>secondary</span>)中。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>94</span></u>
.align 2</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>95</span></u>
read_char:</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>96</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
inb %dx,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>读取接收缓冲寄存器<span lang=EN-US>RBR</span>中字符<span lang=EN-US
style='font-family:Wingdings'>è</span><span lang=EN-US>al</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>97</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
movl %ecx,%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>当前串口缓冲队列指针地址<span
lang=EN-US style='font-family:Wingdings'>è</span><span lang=EN-US>edx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>98</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
subl $_table_list,%edx&nbsp; // </span>当前串口队列指针地址<span lang=EN-US> - </span>缓冲队列指针表首址
<span lang=EN-US style='font-family:Wingdings'>è</span><span lang=EN-US>edx</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>99</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
shrl $3,%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>差值<span lang=EN-US>/8</span>,得串口号。对于串口<span lang=EN-US>1</span><span
lang=EN-US>1</span>,对于串口<span lang=EN-US>2</span><span lang=EN-US>2</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>100</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl
(%ecx),%ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # read-queue&nbsp;&nbsp;&nbsp;
// </span>取读缓冲队列结构地址<span lang=EN-US style='font-family:Wingdings'>è</span><span
lang=EN-US>ecx</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>101</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl
head(%ecx),%ebx&nbsp;&nbsp;&nbsp; // </span>取读队列中缓冲头指针<span lang=EN-US
style='font-family:Wingdings'>è</span><span lang=EN-US>ebx</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>102</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movb
%al,buf(%ecx,%ebx) // </span>将字符放在缓冲区中头指针所指位置处。</p>
<p class=a><u><span lang=EN-US style='color:blue'>103</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incl %ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>将头指针前移(右移)一字节。</p>
<p class=a><u><span lang=EN-US style='color:blue'>104</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; andl $size-1,%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>用缓冲区长度对头指针取模操作。</p>
<p class=a><u><span lang=EN-US style='color:blue'>105</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmpl
tail(%ecx),%ebx&nbsp;&nbsp;&nbsp; // </span>缓冲区头指针与尾指针比较。</p>
<p class=a><u><span lang=EN-US style='color:blue'>106</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je 1f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>若指针移动后相等,表示缓冲区满,不保存头指针,跳转。</p>
<p class=a><u><span lang=EN-US style='color:blue'>107</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl
%ebx,head(%ecx)&nbsp;&nbsp;&nbsp; // </span>保存修改过的头指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>108</span></u><span
lang=EN-US> 1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addl $63,%edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>串口号转换成<span lang=EN-US>tty</span>号(<span lang=EN-US>63</span><span
lang=EN-US>64</span>)并作为参数入栈。</p>
<p class=a><u><span lang=EN-US style='color:blue'>109</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pushl %edx</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>110</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call
_do_tty_interrupt&nbsp; // </span>调用<span lang=EN-US>tty</span>中断处理<span
lang=EN-US>C</span>函数(<span lang=EN-US>tty_io.c</span><span lang=EN-US>342</span>行)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>111</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addl $4,%esp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>丢弃入栈参数,并返回。</p>
<p class=a><u><span lang=EN-US style='color:blue'>112</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>113</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>由于设置了发送保持寄存器允许中断标志而引起此次中断。说明对应串行终端的写字符缓冲队</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>列中有字符需要发送。于是计算出写队列中当前所含字符数,若字符数已小于<span
lang=EN-US>256</span>个,则唤醒</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>等待写操作进程。然后从写缓冲队列尾部取出一个字符发送,并调整和保存尾指针。如果写缓</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>冲队列已空,则跳转到<span
lang=EN-US>write_buffer_empty</span>处处理写缓冲队列空的情况。</p>
<p class=a><u><span lang=EN-US style='color:blue'>114</span></u><span
lang=EN-US> .align 2</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>115</span></u><span
lang=EN-US> write_char:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>116</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl
4(%ecx),%ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
write-queue&nbsp; // </span>取写缓冲队列结构地址<span lang=EN-US style='font-family:Wingdings'>è</span><span
lang=EN-US>ecx</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>117</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl
head(%ecx),%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>取写队列头指针<span
lang=EN-US style='font-family:Wingdings'>è</span><span lang=EN-US>ebx</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>118</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subl
tail(%ecx),%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>头指针<span
lang=EN-US> - </span>尾指针<span lang=EN-US> = </span>队列中字符数。</p>
<p class=a><u><span lang=EN-US style='color:blue'>119</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; andl
$size-1,%ebx&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
nr chars in queue</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>120</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je
write_buffer_empty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>若头指针<span
lang=EN-US> = </span>尾指针,说明写队列空,跳转处理。</p>
<p class=a><u><span lang=EN-US style='color:blue'>121</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmpl $startup,%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>队列中字符数还超过<span lang=EN-US>256</span>个?</p>
<p class=a><u><span lang=EN-US style='color:blue'>122</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ja 1f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>超过则跳转处理。</p>
<p class=a><u><span lang=EN-US style='color:blue'>123</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl
proc_list(%ecx),%ebx&nbsp; &nbsp;&nbsp;&nbsp;# wake up sleeping process&nbsp; #
</span>唤醒等待的进程。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>取等待该队列的进程指针,并判断是否为空。</p>
<p class=a><u><span lang=EN-US style='color:blue'>124</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testl
%ebx,%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
# is there any?&nbsp;&nbsp;&nbsp; # </span>有等待写的进程吗?</p>
<p class=a><u><span lang=EN-US style='color:blue'>125</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je 1f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>是空的,则向前跳转到标号<span
lang=EN-US>1</span>处。</p>
<p class=a><u><span lang=EN-US style='color:blue'>126</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl $0,(%ebx)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>否则将进程置为可运行状态(唤醒进程)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>127</span></u><span
lang=EN-US> 1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl tail(%ecx),%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>取尾指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>128</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movb
buf(%ecx,%ebx),%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>从缓冲中尾指针处取一字符<span
lang=EN-US style='font-family:Wingdings'>è</span><span lang=EN-US>al</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>129</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outb %al,%dx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>向端口<span lang=EN-US>0x3f8</span><span
lang=EN-US>0x2f8</span>)写到发送保持寄存器中。</p>
<p class=a><u><span lang=EN-US style='color:blue'>130</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incl %ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>尾指针前移。</p>
<p class=a><u><span lang=EN-US style='color:blue'>131</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; andl $size-1,%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>尾指针若到缓冲区末端,则折回。</p>
<p class=a><u><span lang=EN-US style='color:blue'>132</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl
%ebx,tail(%ecx)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>保存已修改过的尾指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>133</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmpl
head(%ecx),%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// </span>尾指针与头指针比较,</p>
<p class=a><u><span lang=EN-US style='color:blue'>134</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je
write_buffer_empty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>若相等,表示队列已空,则跳转。</p>
<p class=a><u><span lang=EN-US style='color:blue'>135</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>处理写缓冲队列<span
lang=EN-US>write_q</span>已空的情况。若有等待写该串行终端的进程则唤醒之,然后屏蔽发</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>送保持寄存器空中断,不让发送保持寄存器空时产生中断。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果此时写缓冲队列<span
lang=EN-US>write_q</span>已空,表示当前无字符需要发送。于是我们应该做两件事情。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先看看有没有进程正等待写队列空出来,如果有就唤醒之。另外,因为现在系统已无字符</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>需要发送,所以此时我们要暂时禁止发送保持寄存器<span
lang=EN-US>THR</span>空时产生中断。当再有字符被放入</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>写缓冲队列中时,<span
lang=EN-US>serial.c</span>中的<span lang=EN-US>rs_write()</span>函数会再次允许发送保持寄存器空时产生中断,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>因此<span lang=EN-US>UART</span>就又会“自动”地来取写缓冲队列中的字符,并发送出去。</p>
<p class=a><u><span lang=EN-US style='color:blue'>136</span></u><span
lang=EN-US> .align 2</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>137</span></u><span
lang=EN-US> write_buffer_empty:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>138</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl proc_list(%ecx),%ebx&nbsp;&nbsp;&nbsp;&nbsp;
# wake up sleeping process # </span>唤醒等待的进程。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>取等待该队列的进程的指针,并判断是否为空。</p>
<p class=a><u><span lang=EN-US style='color:blue'>139</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testl
%ebx,%ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
# is there any?&nbsp;&nbsp;&nbsp; # </span>有等待的进程吗?</p>
<p class=a><u><span lang=EN-US style='color:blue'>140</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je 1f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>无,则向前跳转到标号<span
lang=EN-US>1</span>处。</p>
<p class=a><u><span lang=EN-US style='color:blue'>141</span></u><span
lang=EN-US>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movl $0,(%ebx)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>否则将进程置为可运行状态(唤醒进程)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>142</span></u><span
lang=EN-US> 1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incl %edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>指向端口<span lang=EN-US>0x3f9</span><span
lang=EN-US>0x2f9</span>)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>143</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inb %dx,%al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>读取中断允许寄存器<span lang=EN-US>IER</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>144</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp 1f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>稍作延迟。</p>
<p class=a><u><span lang=EN-US style='color:blue'>145</span></u><span
lang=EN-US> 1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp 1f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* </span>屏蔽发送保持寄存器空中断(位<span lang=EN-US>1</span><span
lang=EN-US> */</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>146</span></u><span
lang=EN-US> 1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; andb $0xd,%al&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*
disable transmit interrupt */</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>147</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outb %al,%dx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>写入<span lang=EN-US>0x3f9(0x2f9)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>148</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret</span></p>
<div class=a align=center style='text-align:center'><span lang=EN-US>
<hr size=4 width="100%" align=center>
</span></div>
<p class=MsoNormal><span lang=EN-US>&nbsp;</span></p>
</div>
</body>
</html>