鱼C论坛

 找回密码
 立即注册
查看: 2487|回复: 3

【零基础汇编】实验7问题求解决

[复制链接]
发表于 2016-7-4 09:08:30 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 lfjking 于 2016-7-4 15:39 编辑

以下是汇编代码
  1. assume cs:code,ds:data,es:table,ss:stank
  2. ;原始数据段
  3. data segment
  4. ;年份
  5. db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
  6. db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
  7. db '1993', '1994', '1995'
  8. ;收入 dword
  9. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  10. dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000
  11. ;人数
  12. dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  13. dw 11542,14430,15257,17800
  14. data ends
  15. ;目标数据段存放 es 中去
  16. table segment
  17.         db 21 dup('year summ ne ?? ')
  18. table ends
  19. ;栈段
  20. stank segment
  21.         db 8 dup(0)
  22. stank ends

  23. ;代码 功能 将 原始数据段的内容 按  
  24. ;年份 + 空格 + 收入 + 空格 + 人数 + 空格 + 人均收入 + 空格  (0——F)格式写入table中
  25. code segment
  26. start:
  27.         ;数据关联
  28.         mov dx,data
  29.         mov ds,dx
  30.        
  31.         mov dx,table
  32.         mov es,dx
  33.        
  34.         mov dx,stank
  35.         mov ss,dx
  36.         mov sp,8        ;栈顶初始化
  37.        
  38.         ;开始 将 数据 转移
  39.         mov si,0
  40.         mov di,0
  41.         mov ax,0
  42.         mov bx,0
  43.         mov dx,0
  44.         mov cx,21 ;每年所需 的 循环次数
  45. year:push cx
  46.         ;年份 双字 bh
  47.         mov dword ptr es:[bx],[di]
  48.        
  49.         ;空格 byte
  50.         mov byte ptr es:4[bx],' '
  51.        
  52.         ;收入 双字 bl  从 54H 开始
  53.         mov dword ptr es:5[bx],54H[di]
  54.         ;保存 数值 用于 人均 计算
  55.         mov ax,es:5[bx]
  56.         mov dx,es:7[bx]
  57.        
  58.         ;空格 byte
  59.         mov byte ptr es:9[bx],' '
  60.        
  61.         ;人数 si  从 0A8H 字节 开始
  62.         mov word ptr es:0AH[bx],0A8H[si]
  63.         mov cx,0A8H[bx];保存 除数
  64.        
  65.         ;空格 byte
  66.         mov byte ptr es:0CH[bx],' '
  67.        
  68.         ;人均 需要 计算
  69.         div cx
  70.         mov es:0DH[bx],ax
  71.         ;空格 byte
  72.         mov byte ptr es:0FH[bx],' '       
  73.        
  74.         add di,4
  75.         add si,2
  76.        
  77.         add bx,0FH
  78.        
  79.         pop cx
  80.         loop year
  81.         mov ax, 4c00H
  82.         int 21H
  83. code ends
  84. end start
复制代码




masm 时 会出现 下图中的 错误

错误表述

错误表述



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
跟帖的 兄弟已经 给出答案 至于 最后 的 关于 循环不出的问题
经过 我 debug 单步 检测 发现 是 收入 / 人数 这里 出错循环到 后面时 会出现 人数 获取到的值为 0 的 情况造成的
代码 无问题
是前面的数据部分 出问题的 我可能抄写数据部分 时 将 收入  和 人数 都 抄少了一年 所以 造成数据出错
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面 附上 修改后 正常 运行 的 正确代码
  1. assume cs:code,ds:data,es:table,ss:stank
  2. ;栈段
  3. stank segment
  4.         db 16 dup(0)
  5. stank ends
  6. ;原始数据段
  7. data segment
  8. ;年份
  9. db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
  10. db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
  11. db '1993', '1994', '1995'
  12. ;收入 dword (之前的代码 少了 一年 数值 已在 末尾 加上)
  13. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  14. dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000,7089000
  15. ;人数 (之前的代码 少了 一年 数值 已在 末尾 加上)
  16. dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  17. dw 11542,14430,15257,17800,20100
  18. data ends
  19. ;目标数据段存放 es 中去
  20. table segment
  21.         db 21 dup('year summ ne ?? ')
  22. table ends

  23. ;代码 功能 将 原始数据段的内容 按  
  24. ;年份 + 空格 + 收入 + 空格 + 人数 + 空格 + 人均收入 + 空格  (0——F)格式写入table中
  25. code segment
  26. start:
  27.         ;数据关联
  28.         mov dx,data
  29.         mov ds,dx
  30.        
  31.         mov dx,table
  32.         mov es,dx
  33.        
  34.         mov dx,stank
  35.         mov ss,dx
  36.         mov sp,16        ;栈顶初始化
  37.        
  38.         ;开始 将 数据 转移
  39.         mov si,0
  40.         mov di,0
  41.         mov ax,0
  42.         mov bx,0
  43.         mov dx,0
  44.         mov cx,21 ;每年所需 的 循环次数
  45.         s:push cx;保存循环计数
  46.                 ;年份 双字 bh
  47.                 ;因为 mov cx,[di] 是 Word 所以 这里的 赋值 只能分 两次 Word 来 赋值 下面的 Dword 类似
  48.                 ;mov dword ptr es:[bx],[di]
  49.                 mov ax,[di]
  50.                 mov es:[bx],ax
  51.                 mov ax,2H[di]
  52.                 mov es:2H[bx],ax
  53.                
  54.                 ;空格 byte
  55.                 mov byte ptr es:4[bx],' '
  56.                
  57.                 ;收入 双字 bl  从 54H 开始
  58.                 ;mov dword ptr es:5[bx],54H[di]        ;---------------------同上方注解---------------------------
  59.                 ;ax,dx 临时 保存 收入 数值 用于 人均 计算
  60.                 mov ax,54H[di]
  61.                 mov es:5H[bx],ax
  62.                 mov dx,56H[di]
  63.                 mov es:7H[bx],dx
  64.                
  65.                 ;空格 byte
  66.                 mov byte ptr es:9[bx],' '
  67.                
  68.                 ;人数 si  从 0A8H 字节 开始
  69.                 ;cx 临时 保存 人数
  70.                 mov cx,0A8H[si]
  71.                 mov word ptr es:0AH[bx],cx
  72.                
  73.                 ;空格 byte
  74.                 mov byte ptr es:0CH[bx],' '
  75.                
  76.                 ;人均 需要 计算
  77.                 div cx
  78.                 mov es:0DH[bx],ax
  79.                 ;空格 byte
  80.                 mov byte ptr es:0FH[bx],' '       
  81.                
  82.                 add di,4H
  83.                 add si,2H
  84.                 ;(0-15) = (0H-0FH)
  85.                 add bx,10H
  86.                
  87.         ;还原 循环计数
  88.         pop cx
  89.         loop s
  90.        
  91.         mov ax, 4c00H
  92.         int 21H
  93. code ends
  94. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-4 11:13:34 | 显示全部楼层
本帖最后由 zzzz76 于 2016-7-4 11:15 编辑

将48, 54, 63 都分开写,例如  mov dword ptr es:[bx],[di]分开来写成        mov ax, [di]  mov es:[bx], ax        mov ax, 2[di]        mov es:2[bx], ax  并不知道你那种表达为何不可以,但似乎并不规范
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-7-4 11:56:57 | 显示全部楼层
zzzz76 发表于 2016-7-4 11:13
将48, 54, 63 都分开写,例如  mov dword ptr es:,[di]分开来写成        mov ax, [di]  mov es:, ax        mov ax, 2[ ...

谢谢  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-4 13:51:46 | 显示全部楼层
zzzz76 发表于 2016-7-4 11:13
将48, 54, 63 都分开写,例如  mov dword ptr es:,[di]分开来写成        mov ax, [di]  mov es:, ax        mov ax, 2[ ...

谢谢 上楼的 解答
给出 修改后的 代码(其他不变) 但是 还有问题 就是 循环 莫名 出不来。。。蛋疼的紧啊
  1.         mov cx,21 ;每年所需 的 循环次数
  2.         s:push cx;保存循环计数
  3.                 ;年份 双字 bh
  4.                 ;因为 mov cx,[di] 是 Word 所以 这里的 赋值 只能分 两次 Word 来 赋值 下面的 Dword 类似
  5.                 ;mov dword ptr es:[bx],[di]
  6.                 mov ax,[di]
  7.                 mov es:[bx],ax
  8.                 mov ax,2[di]
  9.                 mov es:2[bx],ax
  10.                
  11.                 ;空格 byte
  12.                 mov byte ptr es:4[bx],' '
  13.                
  14.                 ;收入 双字 bl  从 54H 开始
  15.                 ;mov dword ptr es:5[bx],54H[di]        ;---------------------同上方注解---------------------------
  16.                 ;ax,dx 临时 保存 收入 数值 用于 人均 计算
  17.                 mov ax,54H[di]
  18.                 mov es:5[bx],ax
  19.                 mov dx,56H[di]
  20.                 mov es:7[bx],dx
  21.                
  22.                 ;空格 byte
  23.                 mov byte ptr es:9[bx],' '
  24.                
  25.                 ;人数 si  从 0A8H 字节 开始
  26.                 ;cx 临时 保存 人数
  27.                 mov cx,0A8H[si]
  28.                 mov word ptr es:0AH[bx],cx
  29.                
  30.                 ;空格 byte
  31.                 mov byte ptr es:0CH[bx],' '
  32.                
  33.                 ;人均 需要 计算
  34.                 div cx
  35.                 mov es:0DH[bx],ax
  36.                 ;空格 byte
  37.                 mov byte ptr es:0FH[bx],' '       
  38.                
  39.                 add di,4
  40.                 add si,2
  41.                 ;(0-15) = (0H-0FH)
  42.                 add bx,10H
  43.         ;还原 循环计数
  44.         pop cx
  45.         loop s
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 21:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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