注册 登录
编程论坛 汇编论坛

期中课程设计

有容就大 发布于 2012-08-14 19:40, 1141 次点击
话说俺看到了王爽汇编第10章 遇到了一个课程设计 貌似整本书就两个课程设计
俺想了半日 还是不能独立完成 只好去参考答案了
不过经过数次参详 貌似理解了不少 发现王哥真是牛人啊
但是还是有几个地方不甚理解 而且我原原本本的copy上答案的代码后MASMPlus 和 debug调试
都无法显示最终效果
[local]1[/local]
下面是程序的源代码 比较长 不过程序都有比较多的注释 而且两个子函数基本可以不看
程序代码:
assume cs:code,ds:data,es:table

table segment

    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

    db '1993','1994','1995'

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

    dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

    dw 11542,14430,15257,17800

    dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239

    dw 260,304,333

table ends

data segment

    db 32 dup (0)

data ends

code segment

start:   mov ax,data

     mov ds,ax

     mov ax,table

     mov es,ax

     mov bx,0

     mov si,0

     mov di,0

     mov cx,21

     mov dh,2

     mov dl,30

g:   push cx

     push dx

     mov ax,es:[bx]

     mov [si],ax

     mov ax,es:[bx].2

     mov [si].2,ax ;年份入ds:si

     add si,6


     mov ax,es:[bx].84

     mov dx,es:[bx].86

     call dtoc2    ;收入转成十进制字符入ds:si

     add si,10

     mov ax,es:[di].168

     mov dx,0

     call dtoc2    ;人员数转成十进制字符入ds:si

     add si,6

     mov ax,es:[di].210

     mov dx,0

     call dtoc2    ;人均收入转成十进制字符入ds:si

     mov si,0      ;设置ds:si指向需显示字符首地址

b:   mov cx,29       这里有个问题 b:应该是多余的吧 程序里没有对他的跳转

c:   push cx         为什么我在MASMPlus里使用c做一个段不行 ?改成其他的就可以比如n

     mov cl,[si]     即便是该了以后 程序能运行但是无法在屏幕上显示想要的效果?

     jcxz f          ;(ds:si)=0转到f执行

d:   inc si

     pop cx

     loop c

     inc si

     mov al,0

     mov [si],al   ;设置结尾符0

     mov si,0      ;设置ds:si指向需显示字符首地址

     pop dx

     mov cl,2

     call show_str

     add bx,4      ;dword数据指向下一数据单元

     add di,2      ;word数据指向下一数据单元

     add dh,1      ;指向显存下一行

     pop cx

     loop g

     mov ax,4c00h

     int 21h

f:   mov al,20h

     mov [si],al   ;(ds:si)=0的数据改成空格

     jmp d




;名称:dtoc2

;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。

;参数:(ax)=dword型数据的低16位;

;      (dx)=dword型数据的高16位;

;      ds:si指向字符串首地址。

;返回:无。

dtoc2:

     push ax

     push bx

     push cx

     push dx

     push si

     push di

     mov di,0

d20: mov cx,10     ;除数为10

     call divdw

     add cx,30h    ;余数+30h,转为字符

     push cx       ;字符入栈

     inc di        ;记录字符个数

     mov cx,ax


     jcxz d21      ;低位商=0时,转到d21检测高位商

     jmp d20

d21: mov cx,dx

     jcxz d22      ;高低位商全=0时,转到d22执行

     jmp d20

d22: mov cx,di

d23: pop ax        ;字符出栈

     mov [si],al

     inc si        ;ds:si指向下一单元

     loop d23

     mov al,0

     mov [si],al   ;设置结尾符0

     pop di

     pop si

     pop dx

     pop cx

     pop bx

     pop ax

     ret




;名称:divdw

;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。

;参数:(ax)=dword型数据的低16位;

;      (dx)=dword型数据的高16位;

;      (cx)=除数。

;返回:(dx)=结果的高16位;

;      (ax)=结果的低16位;

;      (cx)=余数。

divdw:

     push si

     push bx

     push ax

     mov ax,dx

     mov dx,0

     div cx        ;被除数的高位/cx

     mov si,ax

     pop ax


     div cx        ;(被除数高位的商+低位)/cx

     mov cx,dx     ;余数入cx

     mov dx,si     ;高位的商入dx

     pop bx

     pop si

     ret




;名称:show_str

;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。

;参数:(dh)=行号(取值范围0~24);

;      (dl)=列号(取值范围0~79);

;      (cl)=颜色;

;      ds:si指向字符串的首地址。

;返回:无。

show_str:

     push ax

     push bx

     push es

     push si

     mov ax,0b800h

     mov es,ax

     mov ax,160

     mul dh

     mov bx,ax     ;bx=160*dh

     mov ax,2

     mul dl        ;ax=dl*2

     add bx,ax     ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址

     mov al,cl     ;把颜色cl赋值al

     mov cl,0

show0:

     mov ch,[si]

     jcxz show1    ;(ds:si)=0时,转到show1执行   


     mov es:[bx],ch

     mov es:[bx].1,al

     inc si        ;ds:si指向下一个字符地址

     add bx,2      ;es:bx指向下一个显存地址

     jmp show0

show1:

     pop si

     pop es

     pop bx

     pop ax

     ret




code ends

end start
// 话说论坛的字体变色有很大的改进啊
看官们看下 我的编译错误 放在沙发上吧 这里貌似传不了了

[local]1[/local]


[ 本帖最后由 有容就大 于 2012-8-14 19:53 编辑 ]
20 回复
#2
zklhp2012-08-14 19:41
我是沙发
#3
有容就大2012-08-14 19:43
只有本站会员才能查看附件,请 登录


-----
只有本站会员才能查看附件,请 登录


----
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

#4
有容就大2012-08-14 19:46
按理说 debug .exe后 -g是可以再屏幕上看到绿色的字符的吧。
为什么不行的 而且把那个c改成m后在MASMPlus运行的时候会提示一个MessageBox:
只有本站会员才能查看附件,请 登录

WHY?
#5
有容就大2012-08-14 19:47
以下是引用zklhp在2012-8-14 19:41:38的发言:

我是沙发

好 坐沙发看贴 Z版V5.
#6
有容就大2012-08-14 19:50
为什么发个效果图 把俺的改成了
只有本站会员才能查看附件,请 登录

再发:
只有本站会员才能查看附件,请 登录

#7
有容就大2012-08-14 19:51
??、
在下面的帖子了 写上 [local]?[/local]就能出来……? = 1.
#8
zklhp2012-08-14 19:53
只有本站会员才能查看附件,请 登录


注意看我的执行方法 认真学习 深刻领悟
#9
zklhp2012-08-14 19:55
至于上面的c的问题 可能是和什么关键字冲突罢 要么就是bug 具体我也不知道。。
#10
有容就大2012-08-14 19:58
我的cmd没有Z盘符啊 为什么要加command 后 用dos?

我去试了下 这个过程和结果
只有本站会员才能查看附件,请 登录

光标一直到处打游击?
#11
zklhp2012-08-14 19:59
意思是 在执行前先运行command dos是这个程序的名字 至于盘符 你纠结这个做什么
#12
zklhp2012-08-14 20:01
已经没问题了罢 速度结题给分罢 给了分我早睡觉明天早起搬砖。。
#13
有容就大2012-08-14 20:03
回复 12楼 zklhp
哈哈 我笑的不行了 我全力支持你的搬砖大业 不过等我把结果弄出来吧

#14
zklhp2012-08-14 20:03
以下是引用有容就大在2012-8-14 20:03:24的发言:

哈哈 我笑的不行了 我全力支持你的搬砖大业 不过等我把结果弄出来吧

已经能编译能运行了 已经没问题了。。
#15
有容就大2012-08-14 20:08
回复 14楼 zklhp
no 你看下的在debug下的编译过程 虽然有绿字出现为什么是这个现象?
那步出错?
只有本站会员才能查看附件,请 登录

#16
有容就大2012-08-14 20:13
哈哈 失误啊 好了 谢谢Z版帮忙 吃
原来我那个11\xh文件没改好


只有本站会员才能查看附件,请 登录



[ 本帖最后由 有容就大 于 2012-8-14 20:15 编辑 ]
#17
有容就大2012-08-14 20:18
这个是最终的执行路线
只有本站会员才能查看附件,请 登录


Z版 爱死你了。
#18
zklhp2012-08-14 20:23
打cls 让屏幕上的字少一点 好看
#19
有容就大2012-08-14 20:29
以下是引用zklhp在2012-8-14 20:23:09的发言:

打cls 让屏幕上的字少一点 好看

嗯 不错的注意 。
只有本站会员才能查看附件,请 登录



[ 本帖最后由 有容就大 于 2012-8-14 20:31 编辑 ]
#20
信箱有效2012-08-14 20:38
也给我点分,接完分我明早也早起去送快件。
#21
有容就大2012-08-14 20:54
回复 20楼 信箱有效
你这次来晚了 哈哈
1