注册 登录
编程论坛 汇编论坛

关于masm5.0错误信息代码的问题

shuojingcao 发布于 2012-09-26 12:32, 659 次点击
王爽老师书里面第八章实验的程序。写了一个比较短的程序   但是在用masm编译的时候出现了好多错误代码 着实把我吓了一大跳   修改了几个错误  但是还是有9个逻辑错误 请帮忙指出错误在哪里  

   代码如下:
assume cs:codesg

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,15257,17800

data ends

table segment
    db 21 dup ('year summ ne ?? ')
table ends

stack segment
    dw 0,0,
stack ends

codesg segment
start:  mov ax,data
     mov ds,ax
      
     mov bx,0
     mov si,0
     mov di,0
      
     mov cx,21
s:   mov ax,[bx]
     mov table:[di],ax
     add bx,2
      
     mov ax,[bx]
     mov table:[di+2],ax

     mov ax,[bx+52h]
     mov table:[di+5],ax
     add,bx,2
      
     mov ax,[bx+52h]
     mov table:[di+7],ax
      
     mov ax,[si+0ah]
     mov table:[di+0ah],ax
     push bx

     mov dx,table:[di+7]
     mov ax,table:[di+5]
     mov bx,table:[di+0ah]
     div bx
     mov table:[di+0dh],ax
     
     pop bx

     add bx,4
     add di,16
     add si,2
     
    loop s
     mov ax,4c00h
     int 21h

codesg ends
end start   

       mov ax,4c00h
       int 21h
codesg ends
end start
      

   编译中的错误代码:
2.txt(9): warning A4101: Missing data; zero assumed
2.txt(22): warning A4101: Missing data; zero assumed
2.txt(35): error A2068: Cannot address with segment register
2.txt(39): error A2068: Cannot address with segment register
2.txt(42): error A2068: Cannot address with segment register
2.txt(43): warning A4101: Missing data; zero assumed
2.txt(46): error A2068: Cannot address with segment register
2.txt(49): error A2068: Cannot address with segment register
2.txt(52): error A2068: Cannot address with segment register
2.txt(53): error A2068: Cannot address with segment register
2.txt(54): error A2068: Cannot address with segment register
2.txt(56): error A2068: Cannot address with segment register

  50386 + 450062 Bytes symbol space free

      3 Warning Errors
      9 Severe  Errors
6 回复
#2
zklhp2012-09-26 12:43
看错误信息先看error再看warning

mov table:[di],ax

你这里面最严重的问题是这个 虽然table是个段 但不能这么写 只有段寄存器可以用于寻址 所以 必须是

mov ax, seg table
mov ds, ax

然后 再用 mov ds:[di],ax

学语言要按照语言的规定来 不能自创 自创的东西一般是错的


#3
zklhp2012-09-26 12:44
但是在用masm编译的时候出现了好多错误代码 着实把我吓了一大跳

这几个就吓着了 很多时候 一个标点符号错了就会带来成百上千个错误
#4
shuojingcao2012-09-26 19:17
回复 楼主 shuojingcao
版主你好! 首先谢谢版主如此细致的为我讲解错误原因,由于我是刚刚开始学习8086汇编所以对于编程中的很多技巧和格式不了解。版主的解答我否可以这样理解  是否由于我没有定义table段的段地址 所以出现了错误   应该和程序开始定义data段一样  先需要让cpu知道我的table段的段地址   
#5
zklhp2012-09-26 20:17
以下是引用shuojingcao在2012-9-26 19:17:35的发言:

版主你好! 首先谢谢版主如此细致的为我讲解错误原因,由于我是刚刚开始学习8086汇编所以对于编程中的很多技巧和格式不了解。版主的解答我否可以这样理解  是否由于我没有定义table段的段地址 所以出现了错误   应该和程序开始定义data段一样  先需要让cpu知道我的table段的段地址   

首先 这不是技巧和格式 这是最基本的 学8086必须学会的东西。。

其次呢 因为8086的寻址方式就是段:偏移量 所以 你必须把相应的段的地址放在段寄存器里 然后寻址 8086里基本上都是这个样子 你的写法是错误的 虽然意思对但和CPU的设计不符

是否由于我没有定义table段的段地址 所以出现了错误

你定义了table段 但没有把段地址符给段寄存器

data segment

    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

这些东西是段的定义 这样 可执行文件里面就有相应的内容了 而且程序执行的时候也装载到内存里面了 但要寻址 也就访问 还必须要用段寄存器来寻址 所以 只能按照我上面说的那个步骤来
#6
有容就大2012-09-27 10:39
用MASMPlus编译一下 能比较容易的找出错误
你程序的问题是 多了好几个, table段 没有和寄存器联系起来。
书上一般有例子 对比下就能发现问题所在了。
#7
zhu2240392012-09-27 23:22
assume 语句都不来个   牛X
1