<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://www.gentoo-zh.org/extern.php?action=feed&amp;tid=110&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 期中课程设计]]></title>
		<link>https://www.gentoo-zh.org/viewtopic.php?id=110</link>
		<description><![CDATA[期中课程设计 最近发表的帖子。]]></description>
		<lastBuildDate>Thu, 18 Aug 2022 12:52:16 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[期中课程设计]]></title>
			<link>https://www.gentoo-zh.org/viewtopic.php?pid=116#p116</link>
			<description><![CDATA[<p>俺想了半日 还是不能独立完成 只好去参考答案了<br />不过经过数次参详 貌似理解了不少 发现王哥真是牛人啊<br />但是还是有几个地方不甚理解 而且我原原本本的copy上答案的代码后MASMPlus 和 debug调试<br />都无法显示最终效果<br />[local]1[/local]<br />下面是程序的源代码 比较长 不过程序都有比较多的注释 而且两个子函数基本可以不看<br />程序代码：</p><br /><p>assume cs:code,ds:data,es:table</p><p>table segment</p><p>&#160; &#160; db &#039;1975&#039;,&#039;1976&#039;,&#039;1977&#039;,&#039;1978&#039;,&#039;1979&#039;,&#039;1980&#039;,&#039;1981&#039;,&#039;1982&#039;,&#039;1983&#039;</p><p>&#160; &#160; db &#039;1984&#039;,&#039;1985&#039;,&#039;1986&#039;,&#039;1987&#039;,&#039;1988&#039;,&#039;1989&#039;,&#039;1990&#039;,&#039;1991&#039;,&#039;1992&#039;</p><p>&#160; &#160; db &#039;1993&#039;,&#039;1994&#039;,&#039;1995&#039;</p><p>&#160; &#160; dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514</p><p>&#160; &#160; dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000</p><p>&#160; &#160; dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226</p><p>&#160; &#160; dw 11542,14430,15257,17800</p><p>&#160; &#160; dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239</p><p>&#160; &#160; dw 260,304,333</p><p>table ends</p><p>data segment</p><p>&#160; &#160; db 32 dup (0)</p><p>data ends</p><p>code segment</p><p>start:&#160; &#160;mov ax,data</p><p>&#160; &#160; &#160;mov ds,ax</p><p>&#160; &#160; &#160;mov ax,table</p><p>&#160; &#160; &#160;mov es,ax</p><p>&#160; &#160; &#160;mov bx,0</p><p>&#160; &#160; &#160;mov si,0</p><p>&#160; &#160; &#160;mov di,0</p><p>&#160; &#160; &#160;mov cx,21</p><p>&#160; &#160; &#160;mov dh,2</p><p>&#160; &#160; &#160;mov dl,30</p><p>g:&#160; &#160;push cx</p><p>&#160; &#160; &#160;push dx</p><p>&#160; &#160; &#160;mov ax,es:[bx]</p><p>&#160; &#160; &#160;mov [si],ax</p><p>&#160; &#160; &#160;mov ax,es:[bx].2</p><p>&#160; &#160; &#160;mov [si].2,ax ;年份入ds:si</p><p>&#160; &#160; &#160;add si,6</p><br /><p>&#160; &#160; &#160;mov ax,es:[bx].84</p><p>&#160; &#160; &#160;mov dx,es:[bx].86</p><p>&#160; &#160; &#160;call dtoc2&#160; &#160; ;收入转成十进制字符入ds:si</p><p>&#160; &#160; &#160;add si,10</p><p>&#160; &#160; &#160;mov ax,es:[di].168</p><p>&#160; &#160; &#160;mov dx,0</p><p>&#160; &#160; &#160;call dtoc2&#160; &#160; ;人员数转成十进制字符入ds:si</p><p>&#160; &#160; &#160;add si,6</p><p>&#160; &#160; &#160;mov ax,es:[di].210</p><p>&#160; &#160; &#160;mov dx,0</p><p>&#160; &#160; &#160;call dtoc2&#160; &#160; ;人均收入转成十进制字符入ds:si</p><p>&#160; &#160; &#160;mov si,0&#160; &#160; &#160; ;设置ds:si指向需显示字符首地址</p><p>b:&#160; &#160;mov cx,29&#160; &#160; &#160; &#160;这里有个问题 b：应该是多余的吧 程序里没有对他的跳转</p><p>c:&#160; &#160;push cx&#160; &#160; &#160; &#160; &#160;为什么我在MASMPlus里使用c做一个段不行 ？改成其他的就可以比如n</p><p>&#160; &#160; &#160;mov cl,[si]&#160; &#160; &#160;即便是该了以后 程序能运行但是无法在屏幕上显示想要的效果?</p><p>&#160; &#160; &#160;jcxz f&#160; &#160; &#160; &#160; &#160; ;(ds:si)=0转到f执行</p><p>d:&#160; &#160;inc si</p><p>&#160; &#160; &#160;pop cx</p><p>&#160; &#160; &#160;loop c</p><p>&#160; &#160; &#160;inc si</p><p>&#160; &#160; &#160;mov al,0</p><p>&#160; &#160; &#160;mov [si],al&#160; &#160;;设置结尾符0</p><p>&#160; &#160; &#160;mov si,0&#160; &#160; &#160; ;设置ds:si指向需显示字符首地址</p><p>&#160; &#160; &#160;pop dx</p><p>&#160; &#160; &#160;mov cl,2</p><p>&#160; &#160; &#160;call show_str</p><p>&#160; &#160; &#160;add bx,4&#160; &#160; &#160; ;dword数据指向下一数据单元</p><p>&#160; &#160; &#160;add di,2&#160; &#160; &#160; ;word数据指向下一数据单元</p><p>&#160; &#160; &#160;add dh,1&#160; &#160; &#160; ;指向显存下一行</p><p>&#160; &#160; &#160;pop cx</p><p>&#160; &#160; &#160;loop g</p><p>&#160; &#160; &#160;mov ax,4c00h</p><p>&#160; &#160; &#160;int 21h</p><p>f:&#160; &#160;mov al,20h</p><p>&#160; &#160; &#160;mov [si],al&#160; &#160;;(ds:si)=0的数据改成空格</p><p>&#160; &#160; &#160;jmp d</p><br /><br /><br /><p>;名称：dtoc2</p><p>;功能：将dword型数据转变为表示十进制的字符串，字符串以0为结尾符。</p><p>;参数：(ax)=dword型数据的低16位；</p><p>;&#160; &#160; &#160; (dx)=dword型数据的高16位；</p><p>;&#160; &#160; &#160; ds:si指向字符串首地址。</p><p>;返回：无。</p><p>dtoc2:</p><p>&#160; &#160; &#160;push ax</p><p>&#160; &#160; &#160;push bx</p><p>&#160; &#160; &#160;push cx</p><p>&#160; &#160; &#160;push dx</p><p>&#160; &#160; &#160;push si</p><p>&#160; &#160; &#160;push di</p><p>&#160; &#160; &#160;mov di,0</p><p>d20: mov cx,10&#160; &#160; &#160;;除数为10</p><p>&#160; &#160; &#160;call divdw</p><p>&#160; &#160; &#160;add cx,30h&#160; &#160; ;余数+30h，转为字符</p><p>&#160; &#160; &#160;push cx&#160; &#160; &#160; &#160;;字符入栈</p><p>&#160; &#160; &#160;inc di&#160; &#160; &#160; &#160; ;记录字符个数</p><p>&#160; &#160; &#160;mov cx,ax</p><br /><p>&#160; &#160; &#160;jcxz d21&#160; &#160; &#160; ;低位商=0时，转到d21检测高位商</p><p>&#160; &#160; &#160;jmp d20</p><p>d21: mov cx,dx</p><p>&#160; &#160; &#160;jcxz d22&#160; &#160; &#160; ;高低位商全=0时，转到d22执行</p><p>&#160; &#160; &#160;jmp d20</p><p>d22: mov cx,di</p><p>d23: pop ax&#160; &#160; &#160; &#160; ;字符出栈</p><p>&#160; &#160; &#160;mov [si],al</p><p>&#160; &#160; &#160;inc si&#160; &#160; &#160; &#160; ;ds:si指向下一单元</p><p>&#160; &#160; &#160;loop d23</p><p>&#160; &#160; &#160;mov al,0</p><p>&#160; &#160; &#160;mov [si],al&#160; &#160;;设置结尾符0</p><p>&#160; &#160; &#160;pop di</p><p>&#160; &#160; &#160;pop si</p><p>&#160; &#160; &#160;pop dx</p><p>&#160; &#160; &#160;pop cx</p><p>&#160; &#160; &#160;pop bx</p><p>&#160; &#160; &#160;pop ax</p><p>&#160; &#160; &#160;ret</p><br /><br /><br /><p>;名称：divdw</p><p>;功能：进行不会产生溢出的除法运算，被除数为dword型，除数为word型，结果为dword型。</p><p>;参数：(ax)=dword型数据的低16位；</p><p>;&#160; &#160; &#160; (dx)=dword型数据的高16位；</p><p>;&#160; &#160; &#160; (cx)=除数。</p><p>;返回：(dx)=结果的高16位；</p><p>;&#160; &#160; &#160; (ax)=结果的低16位；</p><p>;&#160; &#160; &#160; (cx)=余数。</p><p>divdw:</p><p>&#160; &#160; &#160;push si</p><p>&#160; &#160; &#160;push bx</p><p>&#160; &#160; &#160;push ax</p><p>&#160; &#160; &#160;mov ax,dx</p><p>&#160; &#160; &#160;mov dx,0</p><p>&#160; &#160; &#160;div cx&#160; &#160; &#160; &#160; ;被除数的高位/cx</p><p>&#160; &#160; &#160;mov si,ax</p><p>&#160; &#160; &#160;pop ax</p><br /><p>&#160; &#160; &#160;div cx&#160; &#160; &#160; &#160; ;(被除数高位的商+低位)/cx</p><p>&#160; &#160; &#160;mov cx,dx&#160; &#160; &#160;;余数入cx</p><p>&#160; &#160; &#160;mov dx,si&#160; &#160; &#160;;高位的商入dx</p><p>&#160; &#160; &#160;pop bx</p><p>&#160; &#160; &#160;pop si</p><p>&#160; &#160; &#160;ret</p><br /><br /><br /><p>;名称：show_str</p><p>;功能：在指定的位置，用指定的颜色，显示一个用0结束的字符串。</p><p>;参数：(dh)=行号(取值范围0~24)；</p><p>;&#160; &#160; &#160; (dl)=列号(取值范围0~79)；</p><p>;&#160; &#160; &#160; (cl)=颜色；</p><p>;&#160; &#160; &#160; ds:si指向字符串的首地址。</p><p>;返回：无。</p><p>show_str:</p><p>&#160; &#160; &#160;push ax</p><p>&#160; &#160; &#160;push bx</p><p>&#160; &#160; &#160;push es</p><p>&#160; &#160; &#160;push si</p><p>&#160; &#160; &#160;mov ax,0b800h</p><p>&#160; &#160; &#160;mov es,ax</p><p>&#160; &#160; &#160;mov ax,160</p><p>&#160; &#160; &#160;mul dh</p><p>&#160; &#160; &#160;mov bx,ax&#160; &#160; &#160;;bx=160*dh</p><p>&#160; &#160; &#160;mov ax,2</p><p>&#160; &#160; &#160;mul dl&#160; &#160; &#160; &#160; ;ax=dl*2</p><p>&#160; &#160; &#160;add bx,ax&#160; &#160; &#160;;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址</p><p>&#160; &#160; &#160;mov al,cl&#160; &#160; &#160;;把颜色cl赋值al</p><p>&#160; &#160; &#160;mov cl,0</p><p>show0:</p><p>&#160; &#160; &#160;mov ch,[si]</p><p>&#160; &#160; &#160;jcxz show1&#160; &#160; ;(ds:si)=0时，转到show1执行&#160; &#160;</p><br /><p>&#160; &#160; &#160;mov es:[bx],ch</p><p>&#160; &#160; &#160;mov es:[bx].1,al</p><p>&#160; &#160; &#160;inc si&#160; &#160; &#160; &#160; ;ds:si指向下一个字符地址</p><p>&#160; &#160; &#160;add bx,2&#160; &#160; &#160; ;es:bx指向下一个显存地址</p><p>&#160; &#160; &#160;jmp show0</p><p>show1:</p><p>&#160; &#160; &#160;pop si</p><p>&#160; &#160; &#160;pop es</p><p>&#160; &#160; &#160;pop bx</p><p>&#160; &#160; &#160;pop ax</p><p>&#160; &#160; &#160;ret</p><br /><br /><br /><p>code ends</p><p>end start</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Thu, 18 Aug 2022 12:52:16 +0000</pubDate>
			<guid>https://www.gentoo-zh.org/viewtopic.php?pid=116#p116</guid>
		</item>
	</channel>
</rss>
