鱼C论坛

 找回密码
 立即注册
查看: 21|回复: 1

汇编实验七

[复制链接]
发表于 6 小时前 | 显示全部楼层 |阅读模式

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

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

x
哈哈,这种时隔多年发生羁绊的评论还是很让人激动的
回归正题,先给一下我的源码和结果吧(我的段定义并没有完全依照课本上,我做了一些“优化”,为了大家理解我也在旁边做了解释“
assume cs:a

b segment
dw   1975h,1976h,1977h,1978h,1979h,1980h,1983h
dw   1984h,1985h,1986h,1987h,1988h,1989h,1990h   ;这里换成16进制是为了在内存中更直观的体现出来,难度与原差异不大
dw   1991h,1992h,1993h,1994h,1995h,1996h,1997h
b ends

c segment
dd 16H,22h,382h,1356h,2390h,8000h,16000h,24486h,50065h,97479h,140417h,197514h          ;但是这里换成十六进制我想了很久,和上面不同这里换成十六进制更多是为了
dd 345980h,590827h,803530h,1183000h,1843000h,2759000h,3753000h,4649000h,5937000h    ;给ax,dx复制。因为我不知道有哪条指令可以将一个十进制化为十六进制并从中分出高低位(因为有的收入大于word型 而ax,dx都是字型)
c ends                                                                                                                                 ;所以我直接将这些收入设为十六进制,也是给大家提个醒,以后涉及到这类问题要将收入先化为十六进制.....也可能是我没学到更牛的指令

d segment
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
d ends

table segment
dd 21 dup (0,0,0,0 );年b2 总c4 人d2 均t2      00 00 00 00,00 00 00 00,00 00 00 00,00 00 00 00      ;我通过完成这个实验也体会到了这个段内存的引用,就是不用管它是dd、dw还是db你只要指向你需要的偏移地址,如现在dd 0,0是两个双字型
table ends                                                                                                                                        ;但其实就是8个字节,你可以在0到1装一个al,2到3装一个ah。所以我后面才发现内存里面有部分零是可以不出现的,但是总收入里面为了后面还会有很多零

e segment
dw  0,0,0,0,0,0
e ends


a segment
start:mov ax,c
      mov ds, ax
          mov ax,d                                                                                        ;调用总,人求均
          mov es,ax
          mov ax,e
          mov ss,ax
          mov sp,10
          
          mov bx,0
          mov si,0
          mov di,0                                                                               ;调试循环参数,bx:调取总。si:调取人数
          mov cx,21                                                                          ;cx:21组
        s:
          mov  ax,[bx]   
          mov dx,[bx+2]          ;调取总的高字节和低字节
          push ax
          push dx
          
          div word ptr es:[si]     ;调取人数
          
          push ds
      push ax                                                            ;调取t地址,由上到下 商,总段,总高,总低
          mov ax, table
          mov ds,ax
          pop [di+12]                                                    ;存入均,si在t,Tt和T人不一样改为di
          pop dx                                                        ;总段放入dx
          pop [di+6]                                                  ;存入总高
          pop [di+4]                                               ;存入总低
          mov ax,es:[si]                                               ;存入人数
          mov [di+8],ax
          push es                                                          ;栈内为ren段
          mov ax,b  
          mov es,ax                                                       ;es为b段
          mov ax,es:[si]
          mov [di+2],ax
          pop es
          mov ds,dx
          add bx,4
          add si,2
          add di,16
          loop s
          
          mov ax,4c00H
          int 21
a ends
end start
我醉了不会发图片,我只截屏了。有需要可以教我。。。


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 6 小时前 | 显示全部楼层
感谢您分享汇编实验七的代码和心得!您的优化和解释很有趣,也体现了对内存管理的深入理解。以下是一些反馈和指导,希望能帮助您和其他鱼油更好地学习。


  1. ; 您的代码片段(部分不完整,我已根据上下文补充注释)
  2. assume cs:a
  3. ; ... 段定义 ...
  4. a segment
  5. start:mov ax,c
  6.       mov ds, ax
  7.       mov ax,d
  8.       mov es,ax
  9.       mov ax,e
  10.       mov ss,ax
  11.       mov sp,10
  12.       mov bx,0
  13.       mov si,0
  14.       mov di,0
  15.       mov cx,21
  16.     s:
  17.       mov ax, [bx]   ; 假设这里加载总收入低字(需根据实际偏移调整)
  18.       mov dx, [bx+2] ; 加载总收入高字
  19.       push ax
  20.       push dx
  21.       div word ptr es:[si] ; 除以人数(需确保es指向d段)
  22.       ; ... 后续操作 ...
  23. a ends
  24. end start
复制代码


代码点评:
- 将数据定义为十六进制是合理的,尤其在调试时更直观。但请注意,汇编中数字字面值(如1975)会被汇编器自动转换,无需手动转十六进制,除非有特殊需求。
- 内存引用理解正确:无论定义为何种类型(dd/dw/db),内存都是字节序列,可通过偏移地址灵活访问。
- 代码中部分指令不完整(如 mov ax, ),需根据逻辑补充操作数。例如,总收入加载可能需用 mov ax, [bx]mov dx, [bx+2]
- 除法部分:确保 div word ptr es:[si] 正确指向人数数据,并注意商和余数的处理。

关于发图片:
在Discuz!论坛发图片的常用方法是:
1. 在发帖编辑界面,点击“图片”按钮(通常是一个相机或图片图标)。
2. 选择“上传图片”,从您的电脑中选择截屏文件。
3. 上传完成后,图片会显示在编辑器中,或以BBCode标签(如

                               
登录/注册后可看大图
)形式插入。
4. 如果论坛支持附件,也可用“附件”功能上传图片,然后在帖子中引用。

注意:图片需先上传到论坛,不可直接粘贴外部链接(遵守论坛规则)。

总结:
您的代码思路清晰,优化体现了对汇编内存模型的掌握。继续加油!如果有具体错误或问题,欢迎补充细节,我会进一步解答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-16 06:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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