. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验7,我知道这个思路较笨,但我看来看去,思路应该正确啊,但DEBUG调试为何不正确啊.救命吧!  [已解决] 回复[ 3次 ]   点击[ 336次 ]  
wsay666
[帖 主]   [ 发表时间:2009-07-12 22:30 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
我知道这个思路较笨,但我看来看去,思路应该正确啊,但DEBUG调试为何不正确啊.救命吧!  
assume cs:code,ds:data,ss:stack
        data 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,15275,17800   
data ends   
table segment  
    db 21 dup ('year summ ne ?? ')   
table ends 
stack segment
        dw 8 dup (0)
        stack ends
        code segment
                start: mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,16
                mov ax,table
                mov es,ax
                mov bx,0
                mov di,0
                mov si,0
                mov cx,21
                s: mov ax,0[si]   ;传'19'至ES:[0]
                mov es:0[bx],ax   
                mov ax,2[si]      ;传'75'至ES:[2]
                mov es:2[bx],ax
                mov ax,84[si]     ;传0000至ES:[5]
                mov es:5[bx],ax
                mov ax,[si+86]    ;传0016至ES:[7]
                mov es:[bx+7],ax
                push ds:[di+168]  ;利用栈传0003至ES:[0A]
                pop es:[bx+0ah]
                mov dx,es:[bx+7]  ;DX=收入栏高位
                mov ax,es:[bx+5]  ;AX=低位
                div word ptr es:[bx+0ah] 
                mov es:[bx+0dh],ax   ;商传ES[0D]
                add si,4           ;年份和收入转至下一个.
                add bx,16          ;ES转至下一行
                add di,2           ;入栈转至人员的下一字.
                loop s
        mov ax,4c00h
        int 21h
        code ends
        end start
mess
[第1楼]   [ 回复时间:2009-07-14 11:32 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
AX=3931  BX=0010  CX=0014  DX=0001  SP=0010  BP=0000  SI=0004  DI=0002
下面是第一次执行,答案没问题,分别是"1975" 00000010h 00030005--注意数据段定义的数据是十进制的,比如16这里就是10h了。
DS=0B68  ES=0B76  SS=0B8B  CS=0B8C  IP=0020   NV UP EI PL NZ NA PO NC
0B8C:0020 26            ES:
0B8C:0021 8907          MOV     [BX],AX                            ES:0010=6579
-d es:0
0B76:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
0B76:0010  79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20   year summ ne ??
0B76:0020  79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20   year summ ne ??
0B76:0030  79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20   year summ ne ??

下面是写入第二个年份,答案也没问题^_^
AX=0003  BX=0020  CX=0013  DX=0001  SP=0010  BP=0000  SI=0008  DI=0004
DS=0B68  ES=0B76  SS=0B8B  CS=0B8C  IP=001E   NV UP EI PL NZ NA PO NC
0B8C:001E 8B04          MOV     AX,[SI]                            DS:0008=3931
-d es:0
0B76:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
0B76:0010  31 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20   1976 .... .. ..
younggay
[第2楼]   [ 回复时间:2009-07-14 13:51 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
但在DEBUG中只有年份显示,其它是乱码.我借用了别人的代码试一试,也是一样的. 
====================== 
呵呵,那是正常现象。看来博主还是对内存中对于数据的存储理解不清楚。 
当我们声明数据用‘’号,说明每个数字都是字符,一个字符占一个内存字节单元,存放的是该字符的ascii码,所以,当我们在debug下查看的时候,右边显示的是这个ascii码对应的字符形式。而如果我们定义的是数据,比如说16,那么,这是一个数据整体,存入内存的时候存放的是16对应的10H,而debug下查看的时候,会将这个10H当作ascii码的值,右边显示的是acsii为10H对应的字符,当然就会是一些期望外的值了。 
要分清字符和数据在内存中的实际存储形式。要看实际的就看内存的值,不看右边的字符,这样也可以。
wsay666
[第3楼]   [ 回复时间:2009-07-15 16:35 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
此贴由 贴主 于 [ 2009-07-15 16:35 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(mess):2分   2楼(younggay):2分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved