. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  最少行数 课设一答案闪亮登场,思路明确,结构清晰,欢迎拍砖!!!!!!  [待解决] 回复[ 6次 ]   点击[ 551次 ]  
lmyycx
[帖 主]   [ 发表时间:2009-01-12 21:26 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42
今天真是高兴啊,搞了差不多一个星期,当中一个难点就是突破不了,那个急啊,真是怀疑自己的智商是不是有问题,今天换了个思路,终于突破了。 哈哈哈哈,爽了!!!!!!!!!!!!!!!!!

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,2759000,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  
table ends

stack segment
    dw 16 dup(0)
stack ends
code segment
  start: mov ax,table
         mov ds,ax 
         mov ax,stack
         mov ss,ax
         mov sp,32
         mov ax,0b800h     
         mov es,ax
                

         mov bx,80*2*2+3*2    ;显示年份 
         mov cx,21
         mov si,0         
      s2:mov ax,[si]    
         mov dx,[si+2]
         mov es:[bx+0],al
         mov es:[bx+2],ah
         mov es:[bx+4],dl
         mov es:[bx+6],dh
         add si,4
         add bx,160       
         loop s2
         
         mov cx,21             ;显示营业额 
         mov bp,80*2*2+25*2
         mov si,84 
      s3:push cx                  
         mov ax,ds:[si+0]        
         mov dx,ds:[si+2]
         add si,4
         push si
         call dwdtoc
         pop si
         pop cx
         loop s3
         
         mov bp,80*2*2+40*2     ;显示人数             
         mov cx,21
         mov si,168                
     s4: mov ax,ds:[si]       
         mov dx,0
         add si,2
         push cx
         push si                  
         call dwdtoc
         pop si
         pop cx
         loop s4
         
         mov bp,80*2*2+60*2    ;显示人均             
         mov cx,21
         mov si,84 
         mov di,168
      s5:push cx
         mov ax,ds:[si+0]
         mov dx,ds:[si+2]        
         mov cx,ds:[di]
         add si,4
         add di,2         
         push di
         push si 
         call divdw                
         call dwdtoc
         pop si
         pop di
         pop cx
         loop s5   
               
         mov ax,4c00h
         int  21h
                 
  dwdtoc:mov di,0           ;双字数字转字符串子程序 ax低位,dx高位 
         mov si,0      
       s:mov cx,10           
         call divdw
         inc di
         add cx,30h         
         push cx            ;数字转换成字符串后连续进栈      
         push ax
         add ax,dx          ;判断高位低位之和是否为零 ,也就是商是否为零 
         mov cx,ax
         pop ax
         jcxz ko
         jmp short s
      ko:mov cx,di
         mov si,0
     s1: pop ax
         mov es:[bp+si],al
         mov byte ptr es:[bp+si+1], 03h
         add si,2
         loop s1
         add bp,160
         ret
         
   divdw:push ax           ;不会溢出的除法。参数:ax低位,dx高位,cx除数 
         push dx           ;返回值ax低位,dx高位,cx余数
         pop ax
         mov dx,0
         div cx
         pop bx
         push ax
         mov ax,bx
         div cx
         mov cx,dx
         pop dx
         ret
                                  
code ends
end start
wsrf
[第1楼]   [ 回复时间:2009-01-13 20:57 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
思路很清晰 赞一个 呵呵
zcouyangpeng
[第2楼]   [ 回复时间:2009-01-28 21:35 ]   [引用]   [回复]   [ top ] 
荣誉值:35
信誉值:44
注册日期:2008-09-03 21:36
恩  很好的思路  

我也去试着写一个
yuhuofei
[第3楼]   [ 回复时间:2009-04-28 17:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:27
楼主为什么不用前边写过的show_str子函数来显示数据呢?这个课程设计1不是想考我们子程序的应用吗?
lmyycx
[第4楼]   [ 回复时间:2009-04-29 12:34 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42
感谢这位朋友的提问,这个问题也是我的不足的地方。本来是准备调用显示程序,但是调用的时候要设置行、列的数值,占用了很多寄存器。而为了保存这些寄存器的值,又得使用栈。非常麻烦。当时为了突破设计一,什么也不顾了,就将显示程序放在双字数字转字符串子程序的后面,没有单独列出来。总之,能把结果做出来是硬道理。以后再来优化吧。再次感谢你!!!
liuzhia
[第5楼]   [ 回复时间:2009-04-30 18:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-30 18:40
也把我的贴上,希望能有朋友给我也指导下.

assume cs:code,ds:data,es:table

data segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
  dw 3,7,9,13,28,38,130,220,476,778
data ends

table segment 
 db 160 dup (0)
table ends 

code segment
start: mov ax,data
  mov ds,ax
  mov ax,table
  mov es,ax

  mov si,0
  mov bx,0
  mov di,0
  mov cx,10
S:
  mov al,[bx]
  mov es:[di],al
  mov al,[bx+1]
  mov es:[di+1],al
  mov al,[bx+2]
  mov es:[di+2],al
  mov al,[bx+3]
  mov es:[di+3],al
  ;把年份写入

  mov ax,28H[bx]
  mov dx,2aH[bx]
  mov es:5H[di],al
  mov es:6H[di],ah
  mov es:7H[di],dl
  mov es:8h[di],dh
  div word ptr ds:50H[si]
  mov es:0dH[di],al
  mov es:0eh[di],ah
  ;算出人平均值
  
  ;把年收入写入,并算出平均值写入

  mov ax,50H[Si]
  mov es:0bH[di],al
  mov es:0cH[di],ah
 
  ;把人数写出

  add di,16
  add bx,4
  add si,2
  loop S

  mov ax,4c00H
  int 21H
code ends
end start
liuzhia
[第6楼]   [ 回复时间:2009-04-30 18:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-30 18:40
这是另一个改进的
data segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
  dw 3,7,9,13,28,38,130,220,476,778
data ends

table segment 
 dw 80 dup (0)
table ends 

code segment
start: mov ax,data
  mov ds,ax
  mov ax,table
  mov es,ax

  mov si,0
  mov bx,0
  mov di,0
  mov cx,10
S:
  mov ax,[bx]
  mov es:[di],ax
  mov ax,[bx+2]
  mov es:[di+2],ax
  ;把年份写入

  mov ax,28H[bx]
  mov dx,2aH[bx]
  mov es:5H[di],ax
  mov es:7H[di],dx
  div word ptr ds:50H[si]
  mov es:0dH[di],ax    ;把年收入写入,并算出平均值写入
  mov ax,50H[Si]
  mov es:0bH[di],ax  ;把人数写出
  add di,16
  add bx,4
  add si,2
  loop S

  mov ax,4c00H
  int 21H
code ends
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved