忘忧草 发表于 2012-3-26 23:44:42

汇编语言

王爽老师的《汇编语言》中实验7,请帮忙看看哪里出错了,先谢谢了。


assume cs:code,ds:data,es:table
data segment
   db '1975','1976','1977','1978','1979','1980','1981','1882','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,197514
   dd 11542,14430,15257,17800

   dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
   dw 11542,14430,15257,17800
   data ends
   
   table segment
   db 21 dup('year summ ne ?? ')
   table ends
code segment
strat: mov ax,data
       mov ds,ax
    mov ax,table
    mov es,ax
    mov bx,0
    mov di,0
    mov si,0
    mov bp,0
    mov cx,21
s: mov ax,
    mov es:,ax
    add di,2
    mov ax,
    add di,2
    mov es:2,ax
    mov ax,ds:08ah
    add bp,2
    mov es:0ah,ax
    mov ax,54h
    add si,2
    mov dx,54h
    mov es:5,ax
    mov es:7,dx
    div word ptr ds:54h
    mov es:0dh,ax
    add bx,10h
    loop s
   
    mov ax,4c00h
    int 21h
   
   code ends
end strat

认真 发表于 2012-3-27 00:39:58

dp 改下别的别的吧,DI也可以,DP是栈的,不知道你这样用行不行,我没试过,每个人都有书写方式的

ztc123 发表于 2012-3-27 01:39:14

编译都通过了 ,你说是哪里错了?

ztc123 发表于 2012-3-27 01:55:25

首先你很乱,1:为什么用两个ADD DI,2;2:08AH是哪里的开始?

学基础 发表于 2012-3-27 04:15:59

写的好乱,建议后面注释一下,编译通过不代表程序正确;P

莫名其妙 发表于 2012-3-27 16:46:45

本帖最后由 莫名其妙 于 2012-3-27 17:15 编辑

首先 给你看下你自己的代码 (有些地方我看的时候按照我的习惯改了点不影响你的思路)
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1882','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,197514
dd 11542,14430,15257,17800

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends

table segment
db 21 dup('year summ ne ?? ')
table ends
code segment
strat: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov di,0
mov si,0
mov bp,0
mov cx,21

s: mov ax,
mov es:,ax
add di,2
mov ax,
add di,2      
;mov es:,ax ;年份入es


mov ax,ds: ;这里是0a8h 人数   而且这个bp 也可以用di 变量代替因为你前面+了一个常量确定了开始位置
add bp,2                     
mov es:,ax


mov ax,
add si,2
mov dx,
mov es:,ax
mov es:,dx ;收入

div word ptr ds: ;这里除以人数 你的 ds: 指向的也不是人数阿
mov es:,ax ;平均工资入es
add bx,10h
loop s

mov ax,4c00h
int 21h

code ends
end strat
严重的影响程序正确的就是那句除法没找对除数!

还有比较有意思的问题就是
mov ax,
mov es:,ax   
add di,2 ;
mov ax,    为什么要 add di,2 不直接写成 mov ax,
add di,2

而且
mov ax,这里你都已经定了54h这个位置了   下面的si +2
add si,2
mov dx,   2也是常数为什么不直接写成56h+si
mov es:,ax
mov es:,dx ;收入

这个程序一趟是按照思路写出來了
但是让人看起来很累 有些你找到地方的直接可以用idate常量表示的
你还要增加一句add给加到变量上
这样写一旦你疏忽一个位置 就可能整个程序数据错位一大截

程序写出來要根据思路增加空格 空行 方便以后注释 或者自己看的时候明白 上一个段是进行什么操作
找准一个位置 用变量+常数来指向   然后在前面的代码都执行完以后统一对变量进行增加减少操作

程序还有错的地方 应该是某个地方加到后来加错了 时间关系给你发一段差不多的代码你对比下(以前一个兄弟发出來要求精简的)
assume cs:code
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'
;以上是表示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型数据
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:mov ax,data
mov ds,ax ;data段地址与ds挂钩

mov ax,table
mov es,ax ;satle段地址与ex挂钩

mov cx,21 ;循环次数21
mov di,0
mov bx,0
mov si,0 ;初始化
s: mov ax,
mov es:,ax
mov ax,2h
mov es:2h,ax ;导入table段年份数据

mov ax,54h
mov es:,ax
mov dx,56h
mov es:,dx ;导入table段收入数据

mov ax,0a8h
mov es:,ax ;导入table雇员数

mov ax,es:
mov dx,es:
div word ptr es: ;计算平均工资
mov es:,ax ;商存入内存

add bx,4 ;data段年份收入偏移地址递增4
add si,2 ;data段雇员数偏移递增2
add di,16 ;table段递增一行

loop s
mov ax,4c00h
int 21h
code ends
end start

ぅ不想懂得ぃ 发表于 2012-3-28 17:04:54

莫名其妙 发表于 2012-3-27 16:46 static/image/common/back.gif
首先 给你看下你自己的代码 (有些地方我看的时候按照我的习惯改了点不影响你的思路) 严重的影响程序正确的就 ...

为什么出来的结果是
1475:000D BF0000      MOV   DI,0000
-g 0053

AX=014DBX=0054CX=0000DX=2580SP=0000BP=0000SI=002ADI=0150
DS=1452ES=1460SS=1452CS=1475IP=0053   NV UP EI PL NZ NA PE NC
1475:0053 B8004C      MOV   AX,4C00
-d es:0
1460:000031 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
1460:001031 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20   1976 .... .. ..
1460:002031 39 37 37 20 7E 01 00-00 20 09 00 20 2A 00 20   1977 ~... .. *.
1460:003031 39 37 38 20 4C 05 00-00 20 0D 00 20 68 00 20   1978 L... .. h.
1460:004031 39 37 39 20 56 09 00-00 20 1C 00 20 55 00 20   1979 V... .. U.
1460:005031 39 38 30 20 40 1F 00-00 20 26 00 20 D2 00 20   1980 @... &. ..
1460:006031 39 38 31 20 80 3E 00-00 20 82 00 20 7B 00 20   1981 .>.. .. {.
1460:007031 39 38 32 20 A6 5F 00-00 20 DC 00 20 6F 00 20   1982 ._.. .. o.
-d
1460:008031 39 38 33 20 91 C3 00-00 20 DC 01 20 69 00 20   1983 .... .. i.
1460:009031 39 38 34 20 C7 7C 01-00 20 0A 03 20 7D 00 20   1984 .|.. .. }.
1460:00A031 39 38 35 20 81 24 02-00 20 E9 03 20 8C 00 20   1985 .$.. .. ..
1460:00B031 39 38 36 20 8A 03 03-00 20 A2 05 20 88 00 20   1986 .... .. ..
1460:00C031 39 38 37 20 7C 47 05-00 20 D2 08 20 99 00 20   1987 |G.. .. ..
1460:00D031 39 38 38 20 EB 03 09-00 20 E9 0A 20 D3 00 20   1988 .... .. ..
1460:00E031 39 38 39 20 CA 42 0C-00 20 C5 0F 20 C7 00 20   1989 .B.. .. ..
1460:00F031 39 39 30 20 18 0D 12-00 20 03 16 20 D1 00 20   1990 .... .. ..
-只能将年份存进去,而别的不行,是我的电脑有什么问题么

莫名其妙 发表于 2012-3-28 17:07:24

本帖最后由 莫名其妙 于 2012-3-28 17:14 编辑

ぅ不想懂得ぃ 发表于 2012-3-28 17:04 http://bbs.fishc.com/static/image/common/back.gif
为什么出来的结果是
1475:000D BF0000      MOV   DI,0000
-g 0053


其实存进去了 只不过后面的代码 ascii码 不能显示出來 只有数字的才能显示出來
                     db1975    空格dd 收入16 空格dw 人数 平均工资
460:000031 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
具体数据忘记了大概就这个意思 你看看对应数据是不是按照顺序拍进去的


而且还有 ....刚写这个的时候才发现我说怎么老除法溢出错误呢 你看看你代码段收入那段数据..........后面都错了!!!!!!!


ぅ不想懂得ぃ 发表于 2012-3-28 17:34:33

莫名其妙 发表于 2012-3-28 17:07 static/image/common/back.gif
其实存进去了 只不过后面的代码 ascii码 不能显示出來 只有数字的才能显示出來
                      ...

嗯嗯,那为什么显示不出来啊,不是机器码的右端是显示ascii码,

莫名其妙 发表于 2012-3-28 19:11:39

ぅ不想懂得ぃ 发表于 2012-3-28 17:34 static/image/common/back.gif
嗯嗯,那为什么显示不出来啊,不是机器码的右端是显示ascii码,

对 显示对应的ascii码

ぅ不想懂得ぃ 发表于 2012-3-29 23:12:15

莫名其妙 发表于 2012-3-28 19:11 static/image/common/back.gif
对 显示对应的ascii码

那是什么原因不能显示啊?

莫名其妙 发表于 2012-3-30 08:29:59

本帖最后由 莫名其妙 于 2012-3-30 08:31 编辑

ぅ不想懂得ぃ 发表于 2012-3-29 23:12 http://bbs.fishc.com/static/image/common/back.gif
那是什么原因不能显示啊?

他不是按照每一位数据一个字节进行存放ascii码的 比如说数据 dw 65535 你认为是一个整数据 但是在内存里他就是
FFFF这样显示的而FF对应的ascii码是什么.....不知道. so !!~你懂了木有?
如果你还要问为什么年份能显示出來 因为年份是db型 你是吧1997 拆开变成1    9    9   7 一位一位的数据来输入的所以能显示出來
页: [1]
查看完整版本: 汇编语言