流浪江湖 发表于 2021-12-13 23:50:45

实验七 求助!!!

在做第一个循环的时候遇到了编译问题,没有看出来问题在哪儿,解决了一个又出现一个,不知道怎么办了,麻烦各位帮忙看看!

问题提示是:<40> :error A2070:invalidinstructionoperands!








assume cs:codesg,ss:stack,es:table,ds:data

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,0,0,0,0,0,0
stack ends

codesg segment
start:mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov ax,stack
        mov ss,ax
        mov sp,16
        mov si,0
        mov di,0
        mov bx,0
        mov cx,3
      s:push cx
                   
        mov cx,8
   s0:mov es:,ds:
        inc si
        add di,16
       
        loop s0       


        pop cx
        add bx,36
        loop s

        mov ax,4c00h
        int 21h

codesg ends
end start


       

jackz007 发表于 2021-12-14 09:40:55

本帖最后由 jackz007 于 2021-12-14 15:26 编辑

      这条指令是无效的
   s0:mov es:,ds:
      mov 指令不允许两个操作数都是内存地址
      这是我修改的代码,你可以关注一下堆栈段的定义和初始化相关的代码。
assume cs:code , es:table , ds:data

data segment para public 'DATA'
      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 para public 'TABLE'
      db 21 dup ('year summ ne ?? ')
table ends

stack segment para stack 'STACK'
      dw 200h dup(0)
stack ends

code segment para public 'CODE'
main proc far
      mov ax,data
      mov ds,ax
      mov ax,table
      mov es,ax
      xor bx,bx
      xor dx,dx
      xor si,si
      mov cx,21
      cld
      s:push si
      movsw
      movsw
      add si,80
      inc di
      movsw
      movsw
      add si,80
      add si,dx
      sub si,bx
      inc di
      movsw
      pop si
      add si,4
      add di,4
      add bx,4
      add dx,2
      loop s      
      mov ax,4c00h
      int 21h
main endp
code ends
end main
      运行实况:
-d es:0 l150

14B3:000031 39 37 35 20 10 00 00-00 20 03 00 20 3F 3F 20   1975 .... .. ??
14B3:001031 39 37 36 20 16 00 00-00 20 07 00 20 3F 3F 20   1976 .... .. ??
14B3:002031 39 37 37 20 7E 01 00-00 20 09 00 20 3F 3F 20   1977 ~... .. ??
14B3:003031 39 37 38 20 4C 05 00-00 20 0D 00 20 3F 3F 20   1978 L... .. ??
14B3:004031 39 37 39 20 56 09 00-00 20 1C 00 20 3F 3F 20   1979 V... .. ??
14B3:005031 39 38 30 20 40 1F 00-00 20 26 00 20 3F 3F 20   1980 @... &. ??
14B3:006031 39 38 31 20 80 3E 00-00 20 82 00 20 3F 3F 20   1981 .>.. .. ??
14B3:007031 39 38 32 20 A6 5F 00-00 20 DC 00 20 3F 3F 20   1982 ._.. .. ??
14B3:008031 39 38 33 20 91 C3 00-00 20 DC 01 20 3F 3F 20   1983 .... .. ??
14B3:009031 39 38 34 20 C7 7C 01-00 20 0A 03 20 3F 3F 20   1984 .|.. .. ??
14B3:00A031 39 38 35 20 81 24 02-00 20 E9 03 20 3F 3F 20   1985 .$.. .. ??
14B3:00B031 39 38 36 20 8A 03 03-00 20 A2 05 20 3F 3F 20   1986 .... .. ??
14B3:00C031 39 38 37 20 7C 47 05-00 20 D2 08 20 3F 3F 20   1987 |G.. .. ??
14B3:00D031 39 38 38 20 EB 03 09-00 20 E9 0A 20 3F 3F 20   1988 .... .. ??
14B3:00E031 39 38 39 20 CA 42 0C-00 20 C5 0F 20 3F 3F 20   1989 .B.. .. ??
14B3:00F031 39 39 30 20 18 0D 12-00 20 03 16 20 3F 3F 20   1990 .... .. ??
14B3:010031 39 39 31 20 38 1F 1C-00 20 22 20 20 3F 3F 20   1991 8... "??
14B3:011031 39 39 32 20 58 19 2A-00 20 16 2D 20 3F 3F 20   1992 X.*. .- ??
14B3:012031 39 39 33 20 28 44 39-00 20 5E 38 20 3F 3F 20   1993 (D9. ^8 ??
14B3:013031 39 39 34 20 28 F0 46-00 20 99 3B 20 3F 3F 20   1994 (.F. .; ??
14B3:014031 39 39 35 20 68 97 5A-00 20 88 45 20 3F 3F 20   1995 h.Z. .E ??

流浪江湖 发表于 2021-12-17 23:54:27

jackz007 发表于 2021-12-14 09:40
这条指令是无效的

      mov 指令不允许两个操作数都是内存地址


我。。。我才学到实验七!你写的代码我不怎么能看明白!但我知道你是大佬{:10_250:}

流浪江湖 发表于 2021-12-17 23:55:37

jackz007 发表于 2021-12-14 09:40
这条指令是无效的

      mov 指令不允许两个操作数都是内存地址


data segment para public 'DATA'
这句话前面我能看懂后面 para public ‘DATA’我就看不懂了{:10_266:}

jackz007 发表于 2021-12-18 00:19:15

本帖最后由 jackz007 于 2021-12-18 00:22 编辑

流浪江湖 发表于 2021-12-17 23:55
data segment para public 'DATA'
这句话前面我能看懂后面 para public ‘DATA’我就看不懂了

      这个属于汇编伪指令,是用来 "指挥" 汇编程序用的,没有必要都看懂,汇编语言源程序文件的基本框架都差不多,只要能编译过去,照葫芦画瓢就好了,关键是汇编语言代码必须得逐条看懂才行。

laitianliang 发表于 2021-12-18 14:25:40

流浪江湖 发表于 2021-12-17 23:55
data segment para public 'DATA'
这句话前面我能看懂后面 para public ‘DATA’我就看不懂了

我也是正在去理解这个,这个是我网上搜集总结的,尽量去理解吧
; DATA SEGMENT USE16 PARA PUBLIC 'DATA'
; DATA
; 这是细分的名称

; SEGMENT
; 这是细分指令的第一种形式。

; USE16
; 在代码段声明中使用时,它定义默认的操作数大小。 在数据段中使用时,它会限制该段的最大大小。

; PARA
; 对齐段落(16字节)。
;当取值为 16 时,则下一个变量地址为 16 的倍数,即一个段落的边界。
;为了满足对齐要求,汇编器会在变量前插入一个或多个空字节。
;为什么要对齐数据?因为,对于存储于偶地址和奇地址的数据来说,CPU 处理偶地址数据的速度要快得多。

; PUBLIC
; 该段将与模块外部的相同名称的其他段串联在一起,以形成单个连续段。

; 'DATA'
; 这是细分类别。链接器使用它在链接时对段进行排序和分组(合并)。
; 每个具有相同类别的细分都被分组在一起,但也可以进行其他分组(例如数据和未初始化的数据)。

流浪江湖 发表于 2021-12-19 00:01:15

assume cs:codesg,ss:stack,es:table,ds:data

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,0,0,0,0,0,0
stack ends

codesg segment
start:mov ax,data       
                mov ds,ax       
                mov ax,table       
                mov es,ax
                mov si,0
                mov bx,0
                mov di,0
                mov cx,21
          s:mov ax,ds:
                mov es:,ax
                add bx,2
                add di,2
                mov ax,ds:
                mov es:,ax
                add di,14
                add bx,2
                loop s
                mov ax,4c00h
                int 21h
codesg ends
end start
               
        我想问一下,为什么add di, 14 才是覆盖的table段中下一行的第一单元啊?不是应该12吗?
页: [1]
查看完整版本: 实验七 求助!!!