鱼C论坛

 找回密码
 立即注册
查看: 3002|回复: 1

[学习笔记] 《王爽汇编》课程设计1

[复制链接]
发表于 2018-5-24 17:27:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 leader4 于 2018-5-24 17:32 编辑

课程设计1我终于做出来了,用了快一个星期了。。。总算是弄出了完全自主知识产权的代码。。

主要难点有两处:
1、对于子程序与参数分离的理解程度。
由于一开始没有弄明白这点,导致我的全部代码都是重新写的。。。之前练习用的子程序代码根本不可用。
其实真正写这个代码大概用了三天。。剩下四天其实都是在做前几个练习。。
2、程序整体思路。
其实如果把这个想明白了,其他就很好做了。
我一开始想的是:读取一个数据,转化为字符,在显示。然后循环完成。
但这样我写了很长时间,发现寄存器各种冲突,根本写不出来。。。
然后我换了一个思路,先把所有数据处理好,写入table段,然后在一起显示。
这一下就顺风顺水了。这之后,用了两个下午就写出来了。
其实第二个下午主要是找bug。。。
由于之前没有在每个子程序之前保存寄存器,结果还是有冲突的。。debug一步一步找出来才发现是寄存器的问题。。。。
之后就是显存写入有调试了一会儿,总算正常输出了!

插曲:当第一次写完程序编译运行没有得到想要的结果时,真是内心毫无波澜 为什么一点也不感到意外呢~

补充:想用offset定位数据起始位置,结果google发现,数据标号居然不用冒号。。。

下面是代码,分享给初学者参考下。虽然参考价值可能不大。。:(注:我在mac上用的是dosbox,所以显存起始地址有些问题。。)
  1. ;===========================================================================

  2. ;课程设计1

  3. ;将实验7中的power idea公司的数据按照格式在屏幕上显示.

  4. ;===========================================================================

  5. assume cs:codesg,ds:data,ss:stack,es:table

  6. data segment
  7.         year         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  8.                          db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  9.                          db '1993','1994','1995'
  10.         money         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  11.                          dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  12.         people         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  13.                          dw 11542,14430,15257,17800
  14.         average  dw 21 dup (0)
  15.         ;数据标号不用双引号。
  16. data ends


  17. table segment
  18.         db 21 dup (' year    s       n      ?      ',0)
  19.                        ; 1       9       17     24       算上0,共32个字符
  20. table ends

  21. stack segment
  22.         db 16 dup (0)
  23. stack ends


  24. codesg segment
  25. start:
  26. ;年份入table段
  27.         mov ax,data
  28.         mov ds,ax
  29.         mov ax,offset year
  30.         mov si,ax        ;data段首地址ds:si

  31.         mov ax,table
  32.         mov es,ax
  33.         mov di,1        ;table段首地址es:di

  34.         mov cx,21
  35.         year_table:
  36.                 push cx
  37.                 mov cx,2
  38.                 mov bx,0

  39.                 year_table0:
  40.                         mov ax,[si+bx]
  41.                         mov es:[di+bx],ax
  42.                         add bx,2
  43.                         loop year_table0

  44.                 add si,4
  45.                 add di,32
  46.                 pop cx
  47.                 loop year_table
  48. ;--------------------------------
  49. ;收入入table
  50.         mov ax,data
  51.         mov ds,ax
  52.         mov si,offset money

  53.         mov ax,table
  54.         mov es,ax
  55.         mov di,9

  56.         mov cx,21
  57.         money_table:
  58.                 mov bx,0
  59.                 push cx
  60.                 mov ax,[si]
  61.                 mov dx,[si+2]                ;显式给出参数
  62.                 call dtoc
  63.                 add si,4
  64.                 add di,32
  65.                 pop cx
  66.                 loop money_table

  67. ;人数入table
  68.         mov ax,data
  69.         mov ds,ax
  70.         mov si,offset people

  71.         mov ax,table
  72.         mov es,ax
  73.         mov di,17

  74.         mov cx,21
  75.         people_table:
  76.                 mov bx,0
  77.                 push cx
  78.                 mov ax,[si]
  79.                 mov dx,0      ;显式给出参数
  80.                 call dtoc
  81.                 add si,2
  82.                 add di,32
  83.                 pop cx
  84.                 loop people_table

  85. ;平均数入table
  86.         mov ax,data
  87.         mov ds,ax
  88.         mov si,offset money
  89.         mov di,offset people

  90.         mov cx,21
  91.         s:
  92.                 mov ax,[si]
  93.                 mov dx,[si+2]
  94.                 div word ptr [di]
  95.                 push ax
  96.                 add si,4
  97.                 add di,2
  98.                 loop s

  99.         mov si,offset average
  100.         add si,40
  101.         mov cx,21
  102.         s1:
  103.                 pop ax
  104.                 mov [si],ax
  105.                 sub si,2
  106.                 loop s1
  107. ;平均入table
  108.         mov si,offset average

  109.         mov ax,table
  110.         mov es,ax
  111.         mov di,24

  112.         mov cx,21
  113.         average_table:
  114.                 mov bx,0
  115.                 push cx
  116.                 mov ax,[si]
  117.                 mov dx,0       ;显式给出参数
  118.                 call dtoc
  119.                 add si,2
  120.                 add di,32
  121.                 pop cx
  122.                 loop average_table
  123. ;------------------------------
  124. ;将table段显示出来
  125. mov ax,table
  126. mov ds,ax
  127. mov si,0
  128. mov cx,21
  129. mov dh,2
  130. mov dl,0
  131. table_show:
  132.         push cx
  133.         push dx
  134.         mov cl,2
  135.         call show_str
  136.         pop dx
  137.         add dh,1
  138.         pop cx
  139.         loop table_show



  140. mov ax,4c00h
  141. int 21h


  142. ;--------------------------------------------------
  143. dtoc:
  144. ;参数
  145.                 ;(ax)=dword,低16位
  146.                 ;(dx)=dword,高16位
  147.                 ;ds:si指向字符串的首地址
  148. ;===============================
  149. ;保存寄存器
  150.         push ax
  151.         push bx
  152.         push cx
  153.         push dx
  154.         push si
  155.         push di
  156. ;===============================
  157. mov bx,0
  158. dtoc_j:
  159.         mov cx,10
  160.         call divdw
  161.         push cx
  162.         inc bx
  163.         mov cx,ax
  164.         jcxz dtoc_r
  165.         jmp dtoc_j
  166. dtoc_r:
  167.         mov cx,bx
  168.         dtoc_l:
  169.                 pop bx
  170.                 add bx,30H
  171.                 mov es:[di],bl
  172.                 inc di
  173.                 loop dtoc_l
  174. ;===============================
  175. ;恢复寄存器
  176.                 pop di
  177.                 pop si
  178.                 pop dx
  179.                 pop cx
  180.                 pop bx
  181.                 pop ax
  182.                 ret
  183. ;-------------------------------------------
  184. ;-------------------------------------------

  185. divdw:
  186. ;参数
  187.                 ;(ax)=dwrod,低16位
  188.                 ;(dx)=dword,高16位
  189.                 ;(cx)=除数
  190. ;返回
  191.                 ;(dx)=结果的高16位
  192.                 ;(ax)=结果的低16位
  193.                 ;(cx)=余数
  194. ;==========================
  195. ;保存寄存器
  196. push si
  197. push bx
  198. ;=========================
  199. mov bx,ax
  200. mov ax,dx
  201. mov dx,0
  202. div cx
  203. push ax
  204. mov ax,bx       
  205. div cx
  206. mov cx,dx        ;结果的余数
  207. pop dx                ;结果的高16位
  208.                         ;结果的低16位,默认在ax中。
  209. ;=========================
  210. ;恢复寄存器
  211. pop bx
  212. pop si
  213. ret
  214. ;--------------------------------------
  215. ;--------------------------------------
  216. show_str:
  217. ;参数
  218.                         ;(dh)=行号
  219.                         ;(dl)=列号
  220.                         ;(cl)=颜色
  221. ;======================
  222. ;======================
  223. ;计算行号
  224. dec dh
  225. mov ax,0a0h
  226. mul dh
  227. mov bx,ax

  228. ;计算列号
  229. mov ax,2
  230. mul dl
  231. sub ax,2

  232. ;行号+列号
  233. add ax,bx

  234. ;计算显存首地址
  235. mov bx,8000h
  236. add ax,bx
  237. mov di,ax
  238. mov ax,0b000h
  239. mov es,ax

  240. ;写入数据
  241. mov bl,cl
  242. mov bp,0
  243. show_str_s0:
  244.         mov al,ds:[si]
  245.         mov es:[di+bp],al
  246.         mov es:[di+bp+1],bl

  247.         mov cl,[si]
  248.         mov ch,0
  249.         jcxz show_str_s1

  250.         inc si
  251.         add bp,2
  252.         jmp short show_str_s0
  253.         show_str_s1:
  254.         inc si
  255.                 ret

  256. ;======================

  257. codesg ends
  258. end start

复制代码


截图纪念一下

截图纪念一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-9 17:11:51 | 显示全部楼层
我们都是一闪而过的,这个怎么让他停留可以截屏的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 08:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表