|
主题 : : 实验7,我知道这个思路较笨,但我看来看去,思路应该正确啊,但DEBUG调试为何不正确啊.救命吧! [已解决] |
回复[ 3次 ]
点击[ 336次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 | | |
|
|
|
|
[第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 .... .. .. | | |
|
|
|
|
[第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对应的字符,当然就会是一些期望外的值了。
要分清字符和数据在内存中的实际存储形式。要看实际的就看内存的值,不看右边的字符,这样也可以。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-07-15 16:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30 |
此贴由 贴主 于 [ 2009-07-15 16:35 ] 结贴。 结贴原因:问题已解决 | | |
|