飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5889|回复: 7

[C/C++] 汇编语言 课程设计1

[复制链接]
  • TA的每日心情
    开心
    2024-3-7 15:25
  • 签到天数: 442 天

    [LV.9]以坛为家II

    发表于 2010-12-29 14:52:37 | 显示全部楼层 |阅读模式
    本帖最后由 sdnyzjzx 于 2010-12-29 14:56 编辑

    第一个比较大点的代码,贴出来请大家指正。
        由于一开始写每个模块时,并不知道这个课程设计要求,也不懂编程的原则,所以开始设计的每个小模块都只照顾到了自己的功能,没有考虑到其他模块间的调用,加上不知道编程的原则(我认为至少要做好寄存器数据保护与还原),因此整个代码还不是很条理,甚至有点乱,也给后来合并到一起时的调试带来了很多麻烦,尽管如此,从中学到不处东西:  1、了解了栈平衡的重要性;  2、了解了编制一段大点代码要统筹安排,合理分配寄存器的使用,到底想要怎么传递参数,心里一定要清楚;  3、练习了数据的寻址方式。
        尽管不算好,但功能实现了,还是贴出来记录一下,今后再进一步改进。
    1. assume cs:code

    2. data segment

    3.         dw 100 dup (0)
    4.      i  dw 1423,12666,1,8,3,38
    5.      j  dd 1024,1234567,238763,887766,345543,99990088

    6.      d_1   db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    7.            db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    8.            db '1993','1994','1995'

    9.      d_2  dd 16,22,382,1356,2390,8000,160000,24486,50065,97479,140417,197514
    10.           dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

    11.       d_3  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    12.            dw 11542,14430,15257,17800

    13. data ends

    14. table segment

    15.         db 21 dup ('year summ ne ?? ')

    16. table ends

    17. stack segment
    18.         dw 100 dup (0)
    19. stack ends

    20. code segment

    21. start:  mov ax,data
    22.         mov ds,ax
    23.         mov ax,stack
    24.         mov ss,ax
    25.         mov sp,200
    26.         mov ax,table
    27.         mov es,ax
    28.         mov bx,offset d_1                ;年份入栈
    29.         mov cx,21

    30. s1:                                    
    31.         mov ax,[bx]
    32.         push ax
    33.         mov ax,[bx+2]
    34.         push ax
    35.         add bx,4
    36.         loop s1
    37.         mov bx,140h
    38.         mov cx,15h
    39.        
    40. s2:           pop ax                                ;年份出栈到 table 表
    41.         mov es:[bx+2],ax
    42.         pop dx
    43.         mov es:[bx+0],dx
    44.         sub bx,10h
    45.         loop s2
    46.         mov bx,offset d_2
    47.         mov cx,21

    48. s3:     mov ax,[bx]                        ;收入入栈
    49.         push ax
    50.         mov ax,[bx+2]
    51.         push ax
    52.         add bx,4
    53.         loop s3

    54.         mov bx,140h
    55.         mov cx,15h

    56. s4:     pop ax                                ;收入出栈到 table 表
    57.         mov es:[bx+7],ax
    58.         pop dx
    59.         mov es:[bx+5],dx
    60.         sub bx,10h
    61.         loop s4
    62.         
    63.         mov bx,offset d_3                ;雇员人数
    64.         mov cx,21
    65.         mov si,0

    66. s5:     mov ax,[bx]
    67.         push si
    68.         shl si,1
    69.         shl si,1
    70.         shl si,1
    71.         shl si,1
    72.         mov es:[si+0ah],ax
    73.         add bx,2
    74.         pop si
    75.         inc si
    76.         loop s5

    77.         mov cx,21                        ;计算人均收入
    78.         mov bx,0

    79. s6:     mov dx,es:[bx+7]
    80.         mov ax,es:[bx+5]
    81.         div word ptr es:[bx+0ah]
    82.         mov es:[bx+0dh],ax
    83.         add bx,10h
    84.         loop s6
    85. ; 以上获得 table 表数据
    86. ; 以下是显示部分

    87.         mov bx,0                        ;要显示数据的偏移位置        
    88.         mov si,0                           ;保存数据转化为字符后偏移位置
    89.         mov di,0       
    90.         mov cx,21                        ;要转化数据的个数 21行
    91.         push cx

    92. _main:       
    93. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    94. ;显示年份
    95.         call _printable
    96.         add sp,2
    97. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    98. ;显示收入
    99.         mov ax,es:[bx+5]                        ;转化收入为字符
    100.         mov dx,es:[bx+7]
    101.         push cx
    102.         mov cx,0ah
    103.         call dtoc
    104.         pop cx
    105.         push bx
    106.         mov bx,386                        ;3行33列
    107.         call show_str
    108.         pop bx
    109. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    110. ;显示雇员数
    111.         mov ax,es:[bx+0ah]                        ;转化收入为字符
    112.         mov dx,0
    113.         push cx
    114.         mov cx,0ah
    115.         call dtoc
    116.         pop cx
    117.         push bx
    118.         mov bx,410                        ;3行45列
    119.         call show_str
    120.         pop bx
    121. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    122. ;显示人均收入
    123.         mov ax,es:[bx+0dh]                        ;转化收入为字符
    124.         mov dx,0
    125.         push cx
    126.         mov cx,0ah
    127.         call dtoc
    128.         pop cx
    129.         push bx
    130.         mov bx,434                        ;3行57列
    131.         call show_str

    132. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    133. ;循环显示21行
    134.         add di,160       
    135.         pop bx                ;行加1
    136.         add bx,10h
    137.         loop _main
    138. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    139. ;退出程序
    140.         mov ax,4c00h
    141.         int 21h

    142. _printable:
    143.         push bp
    144.         mov bp,sp
    145.         push cx

    146.         push bx
    147.         push si
    148.         push es
    149.         push ax

    150.         xor ax,ax
    151.         mov al,02h                ;显示首行
    152.         mov cx,80*2
    153.         mul cx
    154.         xor dx,dx
    155.         mov dl,18h                ;显示首列
    156.         add dl,dl
    157.         add ax,dx
    158.         add ax,di
    159.         mov si,ax
    160.         mov cx,5

    161. _s_show:
    162.         mov al,es:[bx]                ;显示 1-5 位字符
    163.         push bx
    164.         push es
    165.         mov bx,0b800h
    166.         mov es,bx
    167.         mov es:[si],al
    168.         mov es:[si+1],byte ptr 4                ;字符颜色
    169.         pop es
    170.         pop bx
    171.         inc bx
    172.         inc si
    173.         inc si
    174.         loop _s_show

    175. _s_over:
    176.         pop ax
    177.         pop es
    178.         pop si
    179.         pop bx
    180.         pop cx
    181.         mov sp,bp
    182.         pop bp
    183.         ret                       

    184. dtoc:        push bx       
    185. _s0:    call divdw
    186.         cmp dx,0                        ;商的高位是否为0
    187.         jnz _s1
    188.         cmp ax,0                        ;商的低位是否为0
    189.         jnz _s1
    190.         add cx,30h
    191.         mov [si],cx
    192.         pop bx
    193.         ret                                ;数据转化完成,返回
    194. _s1:                                         ; 写入转化完成的数据为字符
    195.         add cx,30h
    196.         mov [si],cx
    197.         inc si
    198.         mov cx,0ah
    199.         jmp _s0

    200. show_str:
    201.         push es
    202.         mov ax,0b800h
    203.         mov es,ax
    204. xianshi:                                 ;dtoc 显示
    205.        
    206.         mov al,[si]
    207.         mov byte ptr es:[bx+di],al        ;要显示的字符
    208.         mov byte ptr es:[bx+1+di],4        ;要显示字符的颜色
    209.         cmp si,0
    210.         jz ok
    211.         dec si
    212.         add bx,2
    213.         jmp xianshi
    214.         
    215. ok:          pop es
    216.         ret
    217.      
    218. divdw:        push si                                ;dword型数值除法运算
    219.         push di
    220.         mov si,ax                             ;save ax(L)t
    221.         mov ax,dx
    222.         mov dx,0
    223.         div cx                          ;(H/N)
    224.         mov di,dx                              ;save rem(H/N)
    225.         push di
    226.         mov dx,0                        ;int(H/N)
    227.         mov di,2
    228.         mul di
    229.         mov bx,32768                           ;int(H/N)*65536
    230.         mul bx
    231.         pop di
    232.         push ax                         ;save int(H/N)*65536
    233.         push dx
    234.         mov ax,di                        ;Load rem(H/N)
    235.         mov di,2
    236.         mul di
    237.         mul bx
    238.         add ax,si                        ;rem(H/N)*65536+L
    239.         div cx
    240.         mov si,ax
    241.         mov cx,dx
    242.         pop dx
    243.         pop ax
    244.         pop di
    245.         add ax,si
    246.         pop si
    247.         ret

    248. code ends
    249. end start
    复制代码
    kcsj.jpg
    kc.rar (1.74 KB, 下载次数: 24)
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-12-30 13:57:03 | 显示全部楼层
    很给力 good job ~
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-5-31 13:17
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2010-12-31 11:52:03 | 显示全部楼层
    不错,有前途啊,写的很好
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 07:27
  • 签到天数: 1071 天

    [LV.10]以坛为家III

    发表于 2011-1-1 11:51:07 | 显示全部楼层
    太强大了……
    在看第八章……
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2011-1-3 21:09:57 | 显示全部楼层
    学好汇编不容易,大学时学过,不过早忘了./:011
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2011-1-10 16:39:28 | 显示全部楼层
    好厉害,俺考核终于结束了有时间了争取追上大家
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2011-6-9 19:03:05 | 显示全部楼层
    收藏,慢慢研究
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 613 天

    [LV.9]以坛为家II

    发表于 2011-6-28 19:45:14 | 显示全部楼层
    汇编看不懂哦~~~
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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