鱼C论坛

 找回密码
 立即注册
查看: 109|回复: 5

汇编实验七

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

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

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

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
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
FishC 发表于 2025-10-16 00:13
感谢您分享汇编实验七的代码和心得!您的优化和解释很有趣,也体现了对内存管理的深入理解。以下是一些反馈 ...

快救我实验九另一个帖子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:29 | 显示全部楼层
补帖子:我知道如何将一个十进制数(需32位),精准将高低16位分出来了。直接放入内存取高低位。。。看来我领悟的还是不够透
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-21 03:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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