. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  问题7.9新方法,贴代码,望高手指点  [已解决] 回复[ 8次 ]   点击[ 533次 ]  
debugkkk
[帖 主]   [ 发表时间:2008-05-01 22:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
ASSUME CS:CODESG 
DATASG 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' 
   ;以上是表示21年的21个字符串 

   DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 
   DD 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 
   ;以上是表示21年公司收入的21个dword型数据 

   DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 
   DW 11542,14430,15257,17800 
   ;以上是表示21年公司雇员人数的21个word型数据 

DATASG ENDS 

TABLE SEGMENT 
    DB 21 DUP ('YEAR SUMM NE ?? ') 
TABLE ENDS 

CODESG SEGMENT 
START: 
       MOV AX,DATASG 
       MOV DS,AX 
       MOV DI,0 
       MOV BX,0 
       MOV AX,TABLE 
       MOV ES,AX 
       MOV SI,0 
       MOV CX,21 

      S:MOV AX,[DI] 
        MOV ES:[SI],AX                 ;把年份前两位赋值给ES:[SI] 

        MOV AX,[DI+2] 
        MOV ES:[SI+2],AX               ;把年份后两位赋值给ES:[SI+2] 

        MOV AX,[DI+84] 
        MOV ES:[SI+5],AX               ;把收入前两位赋值给ES:[SI+5] 

        MOV AX,[DI+86] 
        MOV ES:[SI+7],AX               ;把收入后两位赋值给ES:[SI+7] 

        MOV AX,[BX+168] 
        MOV ES:[SI+10],AX              ;把雇员人数赋值给ES:[SI+10] 
         
        MOV AX,ES:[SI+5]               ;收入为32位数据,低位赋值给ax,高位赋值给dx,除数为16为数据,故用word ptr,运算结束后商存在ax中,再赋值给ES:[SI+13] 
        MOV DX,ES:[SI+7] 
        DIV WORD PTR ES:[SI+10] 
        MOV ES:[SI+13],AX 
         
        ADD BX,2                       ;雇员人数为word型数据,故每次累加2 
        ADD DI,4                       ;年份和收入都是4字节数据,故每次累加4 
        ADD SI,16                      ;Table数据里每行16字节,故累加16以完成换行 
      
     LOOP S 
         


MOV AX,4C00H 
INT 21H 

CODESG ENDS 
END START 

上次发了次代码,比较长,用了多次循环,这次改进了,只用一次循环。
younggay
[第1楼]   [ 回复时间:2008-05-02 14:10 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
先生存,再生活。在编程之路上同样:先完成,再完善。
楼主能对自己严格要求确实很好。
debugkkk
[第2楼]   [ 回复时间:2008-05-02 17:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
先生存,再生活。很好!
hare
[第3楼]   [ 回复时间:2008-05-05 09:57 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2007-07-25 19:12
不知道楼主编译过没有。。。这是我编译你的程序的结果。。。
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987.  All rights reserved.

Object filename [ps.OBJ]:
Source listing  [NUL.LST]:
Cross-reference [NUL.CRF]:
ps.ASM(48): Out of memory
debugkkk
[第4楼]   [ 回复时间:2008-05-09 09:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
TO hare:

真是奇怪了,我之前明明通过编译了的,我电脑里还保存着WT79-1.exe,debug后的结果和预期的一致。现在再次编译,报错和你一样。

谢谢你提醒,我再试试。
debugkkk
[第5楼]   [ 回复时间:2008-05-09 09:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
结果出来了,程序中的注释出现了问题,第48行用了中文输入法下的“;”,之前用的是英文输入法下的“;”,具体表现为中文输入法下的“;”后面有个空格(这样理解就行了,不准确),英文没有。

我之前编译的时候是没有注释的,所以通过了编译。发帖的时候想起某个朋友提醒过最好附上注释,就写了注释,错在没有注意标点。

我刚才把注释删除了再次编译,正常通过编译,debug生成的程序,和预期一致。

再次谢谢hare的提醒,我又学习到了一点~
debugkkk
[第6楼]   [ 回复时间:2008-05-09 09:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
以后我发布代码前一定会编译成功了才发布,避免出现类似的错误,以免误导他人。

也希望各位朋友多多指点,共同进步。
mess
[第7楼]   [ 回复时间:2008-05-09 09:46 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
常见的小细节,调试的小经验 :-)
debugkkk
[第8楼]   [ 回复时间:2008-05-19 13:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
此贴由 贴主 于 [ 2008-05-19 13:18 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(younggay):4分   3楼(hare):6分   7楼(mess):4分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved