740641642 发表于 2018-8-22 20:43:46

实验7,无法理解,谁能告诉我哪儿错了

本帖最后由 740641642 于 2018-8-22 21:23 编辑

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 11452,14430,15257,17800
data ends
table segment
   db 21 dup ('year summ ne ?? ')
table ends

codesg segment
start:mov ax,data
      mov ds,ax
                mov bx,0
                mov ax,table
                mov ss,ax
                mov bp,0
                mov si,0
                mov cx,21
      S:mov ax,
                  mov ,ax
                  mov ax,
                  mov ,ax
                            
                  mov ax,
                  mov ,ax
                  mov ax,
                  mov ,ax
                  
                  mov ax,
                  mov ,ax
                  mov ax,
                  mov ,ax       
                        mov ax,
                        mov ax,
                        div word ptr
                        mov ,ax
                        add bp,10h
                        mov si,2
                        add bx,2
                        loop S
                mov ax,4c00h
                int 21h
codesg ends
end start
前两行是对的后面就乱了

740641642 发表于 2018-8-22 20:48:30

大哥们

740641642 发表于 2018-8-22 20:49:04

我卡这里很久了

740641642 发表于 2018-8-22 21:22:40

1

740641642 发表于 2018-8-22 22:09:43

2

人造人 发表于 2018-8-22 22:22:03




ss指向table,sp指向哪里?
你的堆栈段在哪?

740641642 发表于 2018-8-23 03:24:18

本帖最后由 740641642 于 2018-8-23 03:25 编辑

人造人 发表于 2018-8-22 22:22
ss指向table,sp指向哪里?
你的堆栈段在哪?

我没用栈段的我是把SS和bp 用在一起的相当于 ds和bx的运用

wuyantao 发表于 2018-8-23 05:54:52

你仔细看一下,前两行的数据也不对
1. S:mov ax,               
                  mov ,ax      ;你这里 应该是mov ss:,ax应明确指出放到哪个段   
                  mov ax,
                  mov ,ax
2. mov ax,table
   mov ss,ax            ;你有es段寄存器不用,弄个栈段寄存器 ss 当数据段寄存器用   
你这代码自己重新捋一下         

wuyantao 发表于 2018-8-23 06:01:51

codesg segment
start:        mov ax,datasg          ;原数据段
                mov ds,ax
                mov ax,table                ;表格数据段
                mov es,ax
               
                mov bx,0
                mov bp,0
                mov cx,21                ;循环次数
                 
                mov si,0               
                mov di,0
                                               
        s:        mov bp,0
                add bp,si
                mov ax,ds:   ;年份
                mov es:,ax       
                mov ax,ds:
                mov es:,ax
                                       
                mov bp,0
                add bp,84               ;21*4=84 向后加84个字节的偏移是收入数据的字段
                add bp,si
                mov ax,ds:        ;收入
                mov es:,ax
                mov ax,ds:
                mov es:,ax
               
                add si,4
               
                mov bp,0
                mov bp,168                ; 向后加168个字节的偏移是人员数据的字段                               
                mov ax,ds:       ;人员数       
                mov es:,ax
                add di,2
                                               
                mov ax,es:    ;人均收入
                mov dx,es:
                div word ptr es:
                mov es:,ax
                                       
                add bx,10h
                loop s
                       
                mov ax,4c00h
                int 21h
codesg ends
end start

740641642 发表于 2018-8-23 15:20:33

本帖最后由 740641642 于 2018-8-23 15:28 编辑

wuyantao 发表于 2018-8-23 05:54
你仔细看一下,前两行的数据也不对
1. S:mov ax,               
                  mov ,ax      ;你 ...

你看一下第8章第一篇的内容我这样是可以的 bp是做为ss的偏移地址
而且不用es 可以少写几个代码

wuyantao 发表于 2018-8-23 21:34:12

mov ax,
mov ,ax
mov ax,    ;你这里不对,这行代码是多余的,雇员人数是word型,你传了个dword,你看
mov ,ax         一下表格 0ch 是什么位置

   mov si,2                  ;这两行不对,逻辑有点问题
   add bx,2   
另外,我确实忘记了 bp 的默认段寄存器是 ss ,确实省了几行化码

57158597@qq.com 发表于 2018-8-26 10:17:43

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

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,800,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

codesg segment
start: mov ax,data
          mov ds,ax
          mov ax,table
                 mov es,ax
          mov bx,0
          mov si,0
          mov di,0a8h
          mov cx,21
      s: mov ax,
          mov es:,ax
          mov ax,
          mov es:,ax
          mov al,
          mov es:,ax
          mov dx,
          mov es:,dx
          mov bp,
          mov es:,bp
          div word ptr bp
          mov es:,al
          add bx,16
          add si,4
          add di,2
          loop s
               
          mov ax,4c00h
          int 21h
codesg ends
end start

正确的代码,你喜欢用SS就把我的ES换成SS就行,但用SS的话就不能单步调试

740641642 发表于 2018-8-26 21:50:09

wuyantao 发表于 2018-8-23 21:34
mov ax,
mov ,ax
mov ax,    ;你这里不对,这行代码是多余的,雇员人数是word型,你传了个dword, ...

啊 我终于发现问题 被你点醒了 确实多余了
add si,2
add bx,2   而且确实是这里出错了
前两次循环是对的 第三次循环就乱了原因出在这
感谢感谢

740641642 发表于 2018-8-26 21:51:03

57158597@qq.com 发表于 2018-8-26 10:17
assume cs:codesg,ds:data,es:table

data segment


thank~
页: [1]
查看完整版本: 实验7,无法理解,谁能告诉我哪儿错了