鱼C论坛

 找回密码
 立即注册
查看: 2017|回复: 7

[汇编作业] 课程设计一

[复制链接]
发表于 2014-9-6 14:50:01 | 显示全部楼层 |阅读模式

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

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

x
  1. assume cs:code,ss:stack,ds:data

  2. data segment
  3. dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
  4. dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
  5. dd 1993,1994,1995

  6. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

  8. dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
  9. dd 11542,14430,15257,17800

  10. dd 32 dup (0)

  11. data ends


  12. stack segment
  13. dw 32 dup(0)
  14. stack ends



  15. code segment

  16. start:   

  17.             mov ax,data
  18.                         mov ds,ax
  19.                         mov ax,stack
  20.                         mov ss,ax
  21.                         mov sp,64
  22.                        
  23.                        
  24.                         mov bx,0
  25.                         mov si,84
  26.                        
  27.                        
  28.                        
  29.                        
  30.                        
  31.                     mov cx,21    ;13
  32.                
  33. kaa:   
  34.                 push cx      ;
  35.                        
  36.              
  37.                        
  38.                        mov ax,[bx]
  39.                         push ax
  40.                         mov ax,[bx+2]    ; 1a
  41.                         push ax
  42.                        
  43.                         pop dx
  44.                         pop ax           ;
  45.                         call dtoc        ;20
  46.                        
  47.                        
  48.                        
  49.                         mov byte ptr ds:[256],2    ;23
  50.                        
  51.             mov dh,ds:[256]             ;显示年份
  52.                         mov dl,2
  53.                         mov cx,2
  54.                        
  55.                         call sss     ;31
  56.                                           ;显示年份

  57.                        
  58.                        
  59.                           
  60.                                            ;收入
  61.                        
  62.                        
  63.                
  64.                        mov ax,[bx+si]           ;34
  65.                         push ax
  66.                         mov ax,[bx+si+2]
  67.                         push ax
  68.                         pop dx
  69.                         pop ax
  70.                         call dtoc        ;3d
  71.                        
  72.                        
  73.                        
  74.                        
  75.                        
  76.                         mov dh,ds:[256]        ;40         ;显示收入
  77.                         mov dl,7
  78.                         mov cx,2
  79.                                                
  80.                
  81.                        
  82.                         call sss                ;49
  83.                        
  84.                                           ;显示收入
  85.                        
  86.                        
  87.                        
  88.                        
  89.                                        ;人数
  90.                        
  91.                        
  92.                         mov ax,[bx+si+84]        ;4c
  93.                         push ax
  94.                         mov ax,[bx+si+86]
  95.                         push ax
  96.                         pop dx
  97.                         pop ax
  98.                         call dtoc                ;56
  99.                        
  100.                   
  101.                        
  102.                        
  103.                         mov dh,ds:[256]         ;59   ;显示人数
  104.                         mov dl,15
  105.                         mov cx,2
  106.                
  107.                        
  108.                         call sss            ;62
  109.                        
  110.                                         ;显示人数
  111.                        
  112.                        
  113.                        
  114.                        
  115.                                             
  116.                         mov ax,[bx+si]     ;68     ;准备收入(被除数);69
  117.                         push ax              ;高16位
  118.                         mov ax,[bx+si+2]    ;68
  119.                         push ax             ; 低16位
  120.                        
  121.                                                                      
  122.                        mov ax,[bx+si+84]     ;6c     ;准备除数(人数)
  123.                         push ax
  124.                        
  125.                         pop cx             ;  ;准备除平均
  126.                         pop dx
  127.                         pop ax             ;6a

  128.                        
  129.                        
  130.                         call divdw      ;73     ;作除法
  131.                        
  132.                        
  133.                        
  134.                        
  135.                        
  136.                         call dtoc            ;76
  137.                        
  138.             
  139.             mov dh,2          ;显示平均数
  140.                         mov dl,20
  141.                         mov cx,2
  142.                        
  143.                   
  144.                         call sss                ;80
  145.                                          
  146.                        
  147.                        
  148.                
  149.                        

  150.                        
  151.             inc dh
  152.                         add bx,4                         ;85
  153.                        
  154.                        
  155.             mov cl,ds:[256]    ;88
  156.                         inc cl
  157.                         mov ds:[256],cl
  158.                        
  159.                        
  160.                         pop cx
  161.                        
  162.                        
  163.                   
  164.                        
  165.                         loop kaa          ;93
  166.                        
  167.                        
  168.                        
  169.                        
  170.                        
  171.                        
  172.                        
  173.                          
  174.                          
  175.                          
  176.         jx:                mov ax,4c00h     ;95
  177.                         int 21h           ;86
  178.                        
  179.                        
  180.                        

  181.                                        
  182.                        
  183.                        
  184.                        
  185.                          
  186.                          
  187.                
  188.                  
  189. dtoc:                        ;抽取数字,并转化为SACII码

  190.                  push dx
  191.                  push cx
  192.                                  push ax
  193.                                  push si
  194.                                  push bx
  195.                


  196.                   
  197.                   mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  198.                   
  199.            s1:    mov cx,10
  200.                                   
  201.                   
  202.                                   call divdw      ;a6
  203.                                   mov di,cx                 ;把余数给di临时保存
  204.                                   mov cx,ax       ;商给CX,用来判断商是否为零; a4
  205.                                   
  206.                          
  207.                   jcxz s2       ;如果CX=0则跳到S1
  208.                                   
  209.                                   mov cx,di      ;恢复CX内值
  210.                  
  211.                   
  212.                   add cx,30h      ;余数加30H,得到相应的ASCII码 ,b1
  213.                                   push cx         ;保存到栈
  214.                   inc bx          ;
  215.                   
  216.                                   
  217.                                   
  218.                   jmp short s1     
  219.                                   
  220.                                   
  221.            s2:   
  222.                           mov cx,di        ;b8
  223.                           add cx,30h       ;商为0时,余数为个位,ba
  224.                           push cx           ;b6
  225.                                   
  226.                                   inc bx          ;be ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
  227.                           
  228.                                   mov cx,bx        ;用CX出栈,把总进栈次数给CX
  229.                                   mov di,cx        ;本程序中,用来保存长度
  230.                                   mov si,257      ;c3
  231.                                   mov ds:[si],cl
  232.                                   
  233.                    s3:          
  234.                           pop ax            ;
  235.                           
  236.                                   mov ds:[si+1],al
  237.                                   inc si            ;
  238.                                   
  239.                                   loop s3            ;cd
  240.                                   
  241.                                   
  242.                                   
  243.                                   
  244.                  
  245.                                                  ;s3实现将栈中的数据依次出栈,放到指定内存
  246.                           
  247.                
  248.                   pop bx     ;cf ;bx压进去对,取出来就不对了??
  249.                       pop si            ;
  250.                                pop ax           
  251.                                   pop cx
  252.                                   pop dx


  253. ret                    ;  d4
  254.              
  255.                   

  256.                   
  257. sss:                  ;子程序 用来显示
  258.             push bx
  259.                         push si
  260.                         push dx
  261.                        
  262.                                                
  263.             mov ax,cx          ;颜色给ax
  264.             mov cl,ds:[257]        ;d9    ds:{256]中的1怎么变成了4????
  265.                        
  266.         ss1a:   push cx          ;dd ;这里显示位置有问题!!!!
  267.                        
  268.                        
  269.                 mov si,257      ;d2
  270.                        
  271.                         call  show_str     ;在指定位置显示 ,d5
  272.                         inc si             ;e4
  273.                         inc dl
  274.                        
  275.                         pop cx        ;e7
  276.                        
  277.                        
  278.                        
  279.                         loop ss1a           ;e8
  280.                        
  281.                         pop dx
  282.                         pop si
  283.                         pop bx
  284.                        
  285.                        
  286.                     ret                    ;e2
  287.                
  288.                   
  289.                   







  290. divdw:  ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数  ,b6
  291.         ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

  292.                  push si        ;e4
  293.                  push bx
  294.                  
  295.                  
  296.          push ax        ;低16位先保存
  297.                  mov ax,dx    ;ax这时候的值是高16位了
  298.                  mov dx,0       ;dx置零是为了不影响下边余数位,使得高16位为0
  299.                  
  300.                  div cx          ;H/N(16位除法)
  301.                  mov bx,ax       ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
  302.                   
  303.                  
  304.                  pop ax          ;ax的值现在是L(低16位)
  305.                  div cx          ;L/N(16除法),ax被除数低16位,dx被除数高16位
  306.                  
  307.                  mov cx,dx
  308.                  mov dx,bx
  309.                  
  310.                  pop bx
  311.                  pop si
  312.                  ret             ;107
  313.                  
  314.                  




  315.                  

  316.          
  317.          
  318.          
  319. show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
  320.           ; ds:si指向字符串首地址
  321.                   
  322.          push cx      ;cc
  323.          push si
  324.                  
  325.                  
  326.                  
  327.                  mov cx,ax      ;颜色给cx
  328.                  
  329.          mov ax,0b800h  ;显存的开始地址
  330.                  mov es,ax     ;10b ;ES中存放是显存的第0页(共0-7页)的起始段地址
  331.        
  332.          mov al,160     ;每行80字符即160字节
  333.          dec dh         ;第八行
  334.                  mul dh         ;111
  335.                  mov bx,ax
  336.                  
  337.                  mov al,2      ;一个字符占二字节
  338.                  dec dl        ;列从零开始,第三列,所以减一
  339.                  mul dl
  340.                      
  341.                  add bx,ax      ;此时BX中放的是行与列的偏移地址
  342.                  mov di,0        ;di 指向显存的偏移地址
  343.                  mov al,cl       ;把颜色参数,放到al;e6
  344.                  
  345.                  mov si,257
  346.                  mov cx,0
  347.                  mov cl,[si]      ;128
  348.                  
  349.                  mov si,258
  350.                  
  351.         str:
  352.              mov ah,ds:[si]   ;ds:[si]指向‘Wlcome to masm!',0,,,,e8
  353.                
  354.                  
  355.        
  356.                  mov es:[bx+si],ah   ;偶字节放字符
  357.                  mov es:[bx+si+1],al  ;奇字节放,颜色属性
  358.                  
  359.                  inc si
  360.                  loop str           ;137
  361.                  
  362.                  
  363.                  
  364.                  
  365.         ok:         pop si
  366.              pop cx
  367.              
  368.                  ret         ;显示字符串的子程序【定义结束】  ;13b
  369.          
  370.                   
  371.                  
  372.         code ends
  373. end start
  374.        
  375.                  
复制代码

课程设计一完成了,但运行没有显示,不知道做的对不对;
谁帮我运行下,看这个完成没有 :handshake



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-6 14:59:05 | 显示全部楼层
上面的程序,把394行,换成:add si,2
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-9-6 15:48:49 | 显示全部楼层
最后改成这个样子,还是显示不出来;晕死了:mad:

  1. assume cs:code,ss:stack,ds:data

  2. data segment
  3. dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
  4. dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
  5. dd 1993,1994,1995

  6. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

  8. dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
  9. dd 11542,14430,15257,17800

  10. dd 32 dup (0)

  11. data ends


  12. stack segment
  13. dw 32 dup(0)
  14. stack ends



  15. code segment

  16. start:   

  17.             mov ax,data
  18.                         mov ds,ax
  19.                         mov ax,stack
  20.                         mov ss,ax
  21.                         mov sp,64
  22.                        
  23.                        
  24.                         mov bx,0
  25.                         mov si,84
  26.                        
  27.                        
  28.                        
  29.                        
  30.                        
  31.                     mov cx,21    ;13
  32.                
  33. kaa:   
  34.                 push cx      ;
  35.                        
  36.              
  37.                        
  38.                        mov ax,[bx]
  39.                         push ax
  40.                         mov ax,[bx+2]    ; 1a
  41.                         push ax
  42.                        
  43.                         pop dx
  44.                         pop ax           ;
  45.                         call dtoc        ;20
  46.                        
  47.                        
  48.                        
  49.                         mov byte ptr ds:[256],2    ;23
  50.                        
  51.             mov dh,ds:[256]             ;显示年份
  52.                         mov dl,2
  53.                         mov cx,2
  54.                        
  55.                         call sss     ;31
  56.                                           ;显示年份

  57.                        
  58.                        
  59.                        
  60.                        
  61.                
  62.                        mov ax,[bx+si]           ;34
  63.                         push ax
  64.                         mov ax,[bx+si+2]
  65.                         push ax
  66.                         pop dx
  67.                         pop ax
  68.                         call dtoc        ;3d
  69.                        
  70.                        
  71.                        
  72.                        
  73.                        
  74.                         mov dh,ds:[256]        ;40         ;显示收入
  75.                         mov dl,7
  76.                         mov cx,2
  77.                                                
  78.                
  79.                        
  80.                         call sss                ;49
  81.                        
  82.                                          
  83.                        
  84.                        
  85.                         mov ax,[bx+si+84]        ;4c
  86.                         push ax
  87.                         mov ax,[bx+si+86]
  88.                         push ax
  89.                         pop dx
  90.                         pop ax
  91.                         call dtoc                ;56
  92.                        
  93.                   
  94.                        
  95.                        
  96.                         mov dh,ds:[256]         ;59   ;显示人数
  97.                         mov dl,15
  98.                         mov cx,2
  99.                
  100.                        
  101.                         call sss            ;62
  102.                        
  103.                                         ;显示人数
  104.                        
  105.                        
  106.                        
  107.                        
  108.                                             
  109.                         mov ax,[bx+si]     ;68     ;准备收入(被除数);69
  110.                         push ax              ;高16位
  111.                         mov ax,[bx+si+2]    ;68
  112.                         push ax             ; 低16位
  113.                        
  114.                                                                      
  115.                        mov ax,[bx+si+84]     ;6c     ;准备除数(人数)
  116.                         push ax
  117.                        
  118.                         pop cx             ;  ;准备除平均
  119.                         pop dx
  120.                         pop ax             ;6a

  121.                        
  122.                        
  123.                         call divdw      ;73     ;作除法
  124.                        
  125.                        
  126.                        
  127.                        
  128.                         call dtoc            ;76
  129.                        
  130.             
  131.             mov dh,2          ;显示平均数
  132.                         mov dl,20
  133.                         mov cx,2
  134.                        
  135.                   
  136.                         call sss                ;80
  137.                                          
  138.                        
  139.                        
  140.                
  141.            
  142.        
  143.                         add byte ptr ds:[256],1                        ;83
  144.                        
  145.                        
  146.          
  147.                        
  148.                        
  149.                         pop cx
  150.                        
  151.                         dec cx            ;89
  152.                         jcxz jx           ;
  153.                        
  154.                         jmp  kaa          ;8c
  155.                        
  156.                
  157.                          
  158.                          
  159.         jx:                mov ax,4c00h     ;8e
  160.                         int 21h           ;91
  161.                        
  162.                        
  163.                        

  164.                                        
  165.                        
  166.                        
  167.                        
  168.                          
  169.                          
  170.                
  171.                  
  172. dtoc:                        ;抽取数字,并转化为SACII码

  173.                  push dx
  174.                  push cx
  175.                                  push ax
  176.                                  push si
  177.                                  push bx
  178.                


  179.                   
  180.                   mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  181.                   
  182.            s1:    mov cx,10      ;9e
  183.                                   
  184.                   
  185.                                   call divdw      ;a6
  186.                                   mov di,cx                 ;把余数给di临时保存
  187.                                   mov cx,ax       ;商给CX,用来判断商是否为零; a4
  188.                                   
  189.                          
  190.                   jcxz s2       ;如果CX=0则跳到S1
  191.                                   
  192.                                   mov cx,di      ;恢复CX内值
  193.                  
  194.                   
  195.                   add cx,30h      ;余数加30H,得到相应的ASCII码 ,a9
  196.                                   push cx         ;保存到栈
  197.                   inc bx          ;
  198.                   
  199.                                   
  200.                                   
  201.                   jmp short s1     
  202.                                   
  203.                                   
  204.            s2:   
  205.                           mov cx,di        ;b8
  206.                           add cx,30h       ;商为0时,余数为个位,b2
  207.                           push cx           ;b6
  208.                                   
  209.                                   inc bx          ;be ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
  210.                           
  211.                                   mov cx,bx        ;用CX出栈,把总进栈次数给CX
  212.                                   mov di,cx        ;本程序中,用来保存长度
  213.                                   mov si,257      ;bb
  214.                                   mov ds:[si],cl  
  215.                                   
  216.                    s3:          
  217.                           pop ax            ;
  218.                           
  219.                                   mov ds:[si+1],al
  220.                                   inc si            ;
  221.                                   
  222.                                   loop s3            ;c5
  223.                                   
  224.                                   
  225.                                   
  226.                                   
  227.                  
  228.                                                  ;s3实现将栈中的数据依次出栈,放到指定内存
  229.                           
  230.                
  231.                   pop bx     ;cf ;bx压进去对,取出来就不对了??
  232.                       pop si            ;
  233.                                pop ax           
  234.                                   pop cx
  235.                                   pop dx


  236. ret                    ;  cc
  237.              
  238.                   

  239.                   
  240. sss:                  ;子程序 用来显示
  241.             push bx
  242.                         push si
  243.                         push dx
  244.                        
  245.                                                
  246.             mov ax,cx          ;颜色给ax
  247.             mov cl,ds:[257]        ;d2    ds:{256]中的1怎么变成了4????
  248.                        
  249.         ss1a:   push cx          ;d6 ;这里显示位置有问题!!!!
  250.                        
  251.                        
  252.                 mov si,257      ;
  253.                        
  254.                         call  show_str     ;在指定位置显示 ,d5
  255.                         inc si             ;dd
  256.                         inc dl
  257.                        
  258.                         pop cx        ;e0
  259.                        
  260.                        
  261.                        
  262.                         loop ss1a           ;e1
  263.                        
  264.                         pop dx
  265.                         pop si
  266.                         pop bx
  267.                        
  268.                        
  269.                     ret                    ;e6
  270.                
  271.                   
  272.                   







  273. divdw:  ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数  ,b6
  274.         ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

  275.                  push si        ;e7
  276.                  push bx
  277.                  
  278.                  
  279.          push ax        ;低16位先保存
  280.                  mov ax,dx    ;ax这时候的值是高16位了
  281.                  mov dx,0       ;dx置零是为了不影响下边余数位,使得高16位为0
  282.                  
  283.                  div cx          ;H/N(16位除法)
  284.                  mov bx,ax       ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
  285.                   
  286.                  
  287.                  pop ax          ;ax的值现在是L(低16位)
  288.                  div cx          ;L/N(16除法),ax被除数低16位,dx被除数高16位
  289.                  
  290.                  mov cx,dx
  291.                  mov dx,bx
  292.                  
  293.                  pop bx
  294.                  pop si
  295.                  ret             ;fc
  296.                  
  297.                  




  298.                  

  299.          
  300.          
  301.          
  302. show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
  303.           ; ds:si指向字符串首地址
  304.                   
  305.          push cx      ;fd
  306.          push si
  307.                  
  308.                  
  309.                  
  310.                  mov cx,ax      ;颜色给cx
  311.                  
  312.          mov ax,0b800h  ;显存的开始地址
  313.                  mov es,ax     ;10b ;ES中存放是显存的第0页(共0-7页)的起始段地址
  314.        
  315.          mov al,160     ;每行80字符即160字节
  316.          dec dh         ;第八行
  317.                  mul dh         ;111
  318.                  mov bx,ax
  319.                  
  320.                  mov al,2      ;一个字符占二字节
  321.                  dec dl        ;列从零开始,第三列,所以减一
  322.                  mul dl
  323.                      
  324.                  add bx,ax      ;此时BX中放的是行与列的偏移地址
  325.                  mov di,0        ;di 指向显存的偏移地址
  326.                  mov al,cl       ;把颜色参数,放到al;e6
  327.                  
  328.                  mov si,257        ;11b
  329.                  mov cx,0
  330.                  mov cl,[si]      ;
  331.                  
  332.                  mov si,258
  333.                  
  334.         str:
  335.              mov ah,ds:[si]   ;ds:[si]指向‘Wlcome to masm!',0,,,,e8
  336.                
  337.                  
  338.        
  339.                  mov es:[bx+si],ah   ;偶字节放字符
  340.                  mov es:[bx+si+1],al  ;奇字节放,颜色属性
  341.                  
  342.                  add si,2
  343.                  loop str           ;132
  344.                  
  345.                  
  346.                  
  347.                  
  348.         ok:         pop si
  349.              pop cx
  350.              
  351.                  ret         ;显示字符串的子程序【定义结束】  ;136
  352.          
  353.                   
  354.                  
  355.         code ends
  356. end start
  357.        
  358.                  
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-9-6 15:57:54 | 显示全部楼层
把61行内容,改写到第34行!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-9-6 17:23:20 | 显示全部楼层
真心看不懂,我是小白的说 :mad:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-9-6 17:33:18 | 显示全部楼层
我终于把它写好了 :loveliness:   欢迎大家指导:big
  1. assume cs:code,ss:stack,ds:data

  2. data segment
  3. dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
  4. dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
  5. dd 1993,1994,1995

  6. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

  8. dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
  9. dd 11542,14430,15257,17800

  10. dd 32 dup (0)

  11. data ends


  12. stack segment
  13. dw 32 dup(0)
  14. stack ends



  15. code segment

  16. start:   

  17.             mov ax,data
  18.                         mov ds,ax
  19.                         mov ax,stack
  20.                         mov ss,ax
  21.                         mov sp,64
  22.                        
  23.                         mov byte ptr ds:[272],5
  24.                        
  25.                         mov bx,0
  26.                         mov si,84
  27.                        
  28.                        
  29.                        
  30.                        
  31.                        
  32.                     mov cx,21    ;13
  33.                
  34. kaa:   
  35.                 push cx      ;
  36.                        
  37.              
  38.                        
  39.                        mov ax,[bx]      ;1c
  40.                         push ax
  41.                         mov ax,[bx+2]    ;
  42.                         push ax
  43.                        
  44.                         pop dx
  45.                         pop ax           ;
  46.                         call dtoc        ;25
  47.                        
  48.                        
  49.                        
  50.             mov dh,ds:[272]     ;28         ;显示年份
  51.                         mov dl,3
  52.                         mov cx,2
  53.                        
  54.                         call show_str     ;31
  55.                        
  56.                        
  57.                
  58.                        mov ax,[bx+si]           ;34
  59.                         push ax
  60.                         mov ax,[bx+si+2]
  61.                         push ax
  62.                         pop dx
  63.                         pop ax
  64.                         call dtoc        ;3d
  65.                        
  66.                        
  67.                        
  68.                        
  69.                        
  70.                         mov dh,ds:[272]        ;40         ;显示收入
  71.                         mov dl,12
  72.                         mov cx,3
  73.                                                
  74.                
  75.                        
  76.                         call show_str                ;49
  77.                        
  78.                                          
  79.                        
  80.                        
  81.                         mov ax,[bx+si+84]        ;4c
  82.                         push ax
  83.                         mov ax,[bx+si+86]
  84.                         push ax
  85.                         pop dx
  86.                         pop ax
  87.                         call dtoc                ;56
  88.                        
  89.                   
  90.                        
  91.                        
  92.                         mov dh,ds:[272]         ;59   ;显示人数
  93.                         mov dl,25
  94.                         mov cx,4
  95.                
  96.                        
  97.                         call show_str            ;62
  98.                        
  99.                                         ;显示人数
  100.                        
  101.                        
  102.                        
  103.                        
  104.                                             
  105.                         mov ax,[bx+si]     ;65    ;准备收入(被除数);69
  106.                         push ax              ;高16位
  107.                         mov ax,[bx+si+2]    ;68
  108.                         push ax             ; 低16位
  109.                        
  110.                                                                      
  111.                        mov ax,[bx+si+84]     ;6    ;准备除数(人数)
  112.                         push ax
  113.                        
  114.                         pop cx             ;  ;准备除平均
  115.                         pop dx
  116.                         pop ax             ;

  117.                        
  118.                        
  119.                         call divdw      ;73     ;作除法
  120.                        
  121.                        
  122.                        
  123.                        
  124.                         call dtoc            ;76
  125.                        
  126.             
  127.             mov dh,ds:[272]
  128.                         mov dl,33
  129.                         mov cx,5
  130.                        
  131.                   
  132.                         call show_str                ;80
  133.                                          
  134.                        
  135.                        
  136.                   
  137.            
  138.        
  139.                    add byte ptr ds:[272],1   ;
  140.                        
  141.            add bx,4          ;86
  142.                        
  143.                         pop cx
  144.                        
  145.                         dec cx            ;
  146.                         jcxz jx           ;8f
  147.                        
  148.                         jmp  kaa          ;
  149.                        
  150.                
  151.                          
  152.                          
  153.         jx:                mov ax,4c00h     ;93
  154.                         int 21h           ;
  155.                        
  156.                        
  157.                        

  158.                                        
  159.                        
  160.                        
  161.                        
  162.                          
  163.                          
  164.                
  165.                  
  166. dtoc:                        ;抽取数字,并转化为SACII码

  167.                  push dx
  168.                  push cx
  169.                                  push ax
  170.                                  push si
  171.                                  push bx
  172.                


  173.                   
  174.                   mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  175.                   
  176.            s1:    mov cx,10      ;9e
  177.                                   
  178.                   
  179.                                   call divdw      ;a6
  180.                                   mov di,cx                 ;把余数给di临时保存
  181.                                   mov cx,ax       ;商给CX,用来判断商是否为零; a4
  182.                                   
  183.                          
  184.                   jcxz s2       ;如果CX=0则跳到S1
  185.                                   
  186.                                   mov cx,di      ;恢复CX内值
  187.                  
  188.                   
  189.                   add cx,30h      ;余数加30H,得到相应的ASCII码 ,a9
  190.                                   push cx         ;保存到栈
  191.                   inc bx          ;
  192.                   
  193.                                   
  194.                                   
  195.                   jmp short s1     
  196.                                   
  197.                                   
  198.            s2:   
  199.                           mov cx,di        ;b8
  200.                           add cx,30h       ;商为0时,余数为个位,b2
  201.                           push cx           ;b6
  202.                                   
  203.                                   inc bx          ;be ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
  204.                           
  205.                                   mov cx,bx        ;用CX出栈,把总进栈次数给CX
  206.                                   mov di,cx        ;本程序中,用来保存长度
  207.                                   mov si,273     ;bb
  208.                                   mov ds:[si],cl  
  209.                                   
  210.                    s3:          
  211.                           pop ax            ;
  212.                           
  213.                                   mov ds:[si+2],al
  214.                                   inc si            ;
  215.                                   
  216.                                   loop s3            ;c5
  217.                                   
  218.                                   
  219.                                   
  220.                                   
  221.                  
  222.                                                  ;s3实现将栈中的数据依次出栈,放到指定内存
  223.                           
  224.                
  225.                   pop bx     ;cf ;bx压进去对,取出来就不对了??
  226.                       pop si            ;
  227.                                pop ax           
  228.                                   pop cx
  229.                                   pop dx


  230. ret                    ;  cc
  231.              
  232.                   










  233. divdw:  ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数  ,b6
  234.         ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

  235.                  push si        ;e7
  236.                  push bx
  237.                  
  238.                  
  239.                  
  240.          push ax        ;低16位先保存
  241.                  mov ax,dx    ;ax这时候的值是高16位了
  242.                  mov dx,0       ;dx置零是为了不影响下边余数位,使得高16位为0
  243.                  
  244.                  div cx          ;H/N(16位除法)
  245.                  mov bx,ax       ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
  246.                   
  247.                  
  248.                  pop ax          ;ax的值现在是L(低16位)
  249.                  div cx          ;L/N(16除法),ax被除数低16位,dx被除数高16位
  250.                  
  251.                  mov cx,dx
  252.                  mov dx,bx
  253.                  
  254.                  pop bx
  255.                  pop si
  256.                  ret             ;fa
  257.                  
  258.                  




  259.                  

  260.          
  261.          
  262.          
  263. show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
  264.           ; ds:si指向字符串首地址
  265.                   
  266.          push cx      ;fd
  267.          push si
  268.                  push bx
  269.                  push dx
  270.                  
  271.                  
  272.                  
  273.                  mov cx,ax      ;颜色给cx
  274.                  
  275.          mov ax,0b800h  ;显存的开始地址
  276.                  mov es,ax     ;10b ;ES中存放是显存的第0页(共0-7页)的起始段地址
  277.        
  278.          mov al,160     ;每行80字符即160字节
  279.          dec dh         ;第八行
  280.                  mul dh         ;111
  281.                  mov bx,ax
  282.                  
  283.                  mov al,2      ;一个字符占二字节
  284.                  dec dl        ;列从零开始,第三列,所以减一
  285.                  mul dl
  286.                      
  287.                  add bx,ax      ;此时BX中放的是行与列的偏移地址
  288.                  mov di,0        ;di 指向显存的偏移地址
  289.                  mov al,cl       ;把颜色参数,放到al;e6
  290.                  
  291.                  mov si,273        ;11b
  292.                  mov cx,0
  293.                  mov cl,[si]      ;
  294.                  
  295.                  
  296.                  
  297.         str:
  298.              mov ah,ds:[si+2]   ;ds:[si]指向‘Wlcome to masm!',0,,,,e8
  299.                
  300.                  
  301.        
  302.                  mov es:[bx],ah   ;偶字节放字符
  303.                  mov es:[bx+1],al  ;奇字节放,颜色属性
  304.                  
  305.                  inc si
  306.                  add bx,2
  307.                  loop str           ;132
  308.                  
  309.                  
  310.                  
  311.                  
  312.         ok:         
  313.              pop dx
  314.                  pop bx
  315.              pop si
  316.              pop cx
  317.              
  318.                  ret         ;显示字符串的子程序【定义结束】  ;136
  319.          
  320.                   
  321.                  
  322.         code ends
  323. end start
  324.        
  325.                  
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-6 17:44:14 | 显示全部楼层
改变:64、84、106、142行cx 值,就可改变数字颜色:titter:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-3 19:35:07 | 显示全部楼层
不错,学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 17:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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