鱼C论坛

 找回密码
 立即注册
查看: 2590|回复: 13

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

[复制链接]
发表于 2018-8-22 20:43:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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,[bx+si+0]
                  mov [bp+0],ax
                  mov ax,[bx+si+2]
                  mov [bp+2],ax
                            
                  mov ax,[bx+si+54h]
                  mov [bp+5h],ax
                  mov ax,[bx+si+56h]
                  mov [bp+7h],ax
                  
                  mov ax,[bx+si+0a8h]
                  mov [bp+0ah],ax
                  mov ax,[bx+si+0aah]
                  mov [bp+0ch],ax       
                        mov ax,[bx+si+54h]
                        mov ax,[bx+si+56h]
                        div word ptr [bx+0a8h]
                        mov [bp+0dh],ax
                        add bp,10h
                        mov si,2
                        add bx,2
                        loop S
                mov ax,4c00h
                int 21h
codesg ends
end start
前两行是对的后面就乱了
QQ拼音截图20180822193809.png
最佳答案
2018-8-23 21:34:12
  mov ax,[bx+si+0a8h]
  mov [bp+0ah],ax
  mov ax,[bx+si+0aah]    ;你这里不对,这行代码是多余的,雇员人数是word型,你传了个dword,你看
  mov [bp+0ch],ax           一下表格 0ch 是什么位置

   mov si,2                  ;这两行不对,逻辑有点问题
   add bx,2   
另外,我确实忘记了 bp 的默认段寄存器是 ss ,确实省了几行化码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-22 20:48:30 From FishC Mobile | 显示全部楼层
大哥们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-22 20:49:04 From FishC Mobile | 显示全部楼层
我卡这里很久了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-22 21:22:40 From FishC Mobile | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-22 22:09:43 From FishC Mobile | 显示全部楼层
2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-22 22:22:03 | 显示全部楼层
1.png


ss指向table,sp指向哪里?
你的堆栈段在哪?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 03:24:18 | 显示全部楼层
本帖最后由 740641642 于 2018-8-23 03:25 编辑
人造人 发表于 2018-8-22 22:22
ss指向table,sp指向哪里?
你的堆栈段在哪?


我没用栈段的  我是把SS和bp 用在一起的  相当于 ds和bx的运用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 05:54:52 | 显示全部楼层
你仔细看一下,前两行的数据也不对
1. S:mov ax,[bx+si+0]               
                  mov [bp+0],ax        ;你这里 应该是mov ss:[bp+0],ax  应明确指出放到哪个段   
                  mov ax,[bx+si+2]
                  mov [bp+2],ax
2. mov ax,table
     mov ss,ax            ;你有es段寄存器不用,弄个栈段寄存器 ss 当数据段寄存器用     
你这代码自己重新捋一下           
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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:[bp+0]     ;年份
                mov es:[bx+0],ax         
                mov ax,ds:[bp+2]
                mov es:[bx+2],ax
                                       
                mov bp,0
                add bp,84                 ;21*4=84 向后加84个字节的偏移是收入数据的字段
                add bp,si
                mov ax,ds:[bp+0]        ;收入
                mov es:[bx+5],ax
                mov ax,ds:[bp+2]
                mov es:[bx+7],ax
               
                add si,4
               
                mov bp,0
                mov bp,168                ; 向后加168个字节的偏移是人员数据的字段                               
                mov ax,ds:[bp+di]       ;人员数       
                mov es:[bx+0ah],ax
                add di,2
                                               
                mov ax,es:[bx+5]    ;人均收入
                mov dx,es:[bx+7]
                div word ptr es:[bx+0ah]
                mov es:[bx+0dh],ax
                                       
                add bx,10h
                loop s
                       
                mov ax,4c00h
                int 21h
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 可以少写几个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 21:34:12 | 显示全部楼层    本楼为最佳答案   
  mov ax,[bx+si+0a8h]
  mov [bp+0ah],ax
  mov ax,[bx+si+0aah]    ;你这里不对,这行代码是多余的,雇员人数是word型,你传了个dword,你看
  mov [bp+0ch],ax           一下表格 0ch 是什么位置

   mov si,2                  ;这两行不对,逻辑有点问题
   add bx,2   
另外,我确实忘记了 bp 的默认段寄存器是 ss ,确实省了几行化码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.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,[si]
          mov es:[bx],ax
          mov ax,[si+2]
          mov es:[bx+2],ax
          mov al,[si+54h]
          mov es:[bx+5],ax
          mov dx,[si+56h]
          mov es:[bx+7],dx
          mov bp,[di]
          mov es:[bx+10],bp
          div word ptr bp
          mov es:[bx+13],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的话就不能单步调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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   而且确实是这里出错了
前两次循环是对的 第三次循环就乱了原因出在这
感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-26 21:51:03 | 显示全部楼层
57158597@qq.com 发表于 2018-8-26 10:17
assume cs:codesg,ds:data,es:table

data segment

thank~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表