鱼C论坛

 找回密码
 立即注册
查看: 4574|回复: 8

[学习笔记] 《零基础入门学习汇编语言》对实验七深入学习

[复制链接]
发表于 2017-8-2 01:27:50 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 shuiyu 于 2017-8-2 01:29 编辑

越努力,越幸运。欢迎大家来看我的笔记 小白刚学,不对的请各位大佬指正,谢谢

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,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                        ;使data段指向ds代码段(系统默认加载ds段)
                mov ds,ax
                mov ax,table                        ;使table段指向es代码段
                mov es,ax
                mov bx,0                                ;把各种需要的寄存器初始化
                mov si,0
                mov di,0
                mov cx,21                        ;因为是21年,而我们的思路又是怎么运算好每一年,                                                               
                                                        ;所以要循环21次               

;下面这一段实现存放年份
s0:                mov al,[bx]                        ;看到[bx]就知道使用了data段,因为定义年份时使用的是db,                                                               
                                                        ;所以我们要用al(8位寄存器)
                                                        ;寄存器存储数据。而又因为我们不能                                                 
                                                        ;使用存储单元之间相互赋值,故才使用al作为中介。         
                mov es:[di],al                        ;bx每次循环加4实现读
                                                        ;取到下一个年份,di每次加16实现存放到table段中的换行。
                mov al,[bx+1]               
                mov es:[di+1],al
                mov al,[bx+2]
                mov es:[di+2],al               
                mov al,[bx+3]
                mov es:[di+3],al

;下面这一段实现存放总收入
                mov ax,[54h+bx]                ;总收入段开始于54H,且定义时使用的是dd(双字型数据),
                                                        ;故使用ax存放低字节,dx存放高字节
                mov dx,[56h+bx]                ;bx每次循环加4实现读取到下一年份的总收入
                mov es:[5h+di],ax                ;在table段中,存放总收入的是在5-8h段,
                                                        ;所以把ax放到5、6中,dx放到7、8中
                mov es:[7h+di],dx                ;di每次循环加16实现存放到table段中的换行。
               
;下面这一段实现存放总人数
                mov ax,[0A8h+si]                ;总人数开始于A8H,且定义时使用的是dw(字型数据),
                                                        ;故每次加2就可以取到下一个年份的总人数
                                                        ;因为在源程序中不能使字母开头,所以在前面加一个0.
                mov es:[0ah+di],ax                ;在table段中,存放总人数的是在A-BH段,所以把ax存放到0AH中
                                                        ;di每次循环加16实现存放到table段中的换行。
               
;下面这一段实现计算人均收入与存放人均收入
                mov ax,[54H+bx]                ;总收入/总人数=人均收入。故读取存放在54H开始的总收入,
                                                        ;为使用div做准备
                mov dx,[56h+bx]               
                div word ptr ds:0a8h[si]        ;总收入/总人数=人均收入。
                mov es:[0dh+di],ax        ;在table段中,存放人均收入的是在D-EH段,
                                                        ;所以把ax存放到0DH中
                                                        ;di每次循环加16实现存放到table段中的换行。
               
               
                add bx,4                        ;实现循环21次,具体情况上面已经说过了
                add si,2
                add di,16
               
                loop s0
                mov ax,4c00h
                int 21h

codesg ends
end start
               
下面的是图解(排版好看一点 ):
一,图解
1.PNG

2.PNG

二、成功编译链接执行
4.PNG

谢谢小甲鱼带来的视频教程,感谢!!


   
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 小白刚学,不对的请各位大佬指教,谢谢

评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-2 15:20:44 | 显示全部楼层
虽然看不太懂,但也要赞一个赞一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-3 22:45:37 | 显示全部楼层
圆冶治 发表于 2017-8-2 15:20
虽然看不太懂,但也要赞一个赞一个

额。。。是我表达得不清楚,还是你不懂?我得改正错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-4 10:41:04 | 显示全部楼层
shuiyu 发表于 2017-8-3 22:45
额。。。是我表达得不清楚,还是你不懂?我得改正错误

只是我不懂而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-4 19:15:02 | 显示全部楼层
你好 楼主 我也做了这个 和你有些不同

table 我用的是ss, 这样就可以直接用[bp] 来当指针
移动年份的时候 可以直接把数据写到AX 里面 这样就一次移动一个字, 而不是一个字节
我试着想一次移动两个字 但是好像不支持

还有一点 我用的bx 当 data的指针 数据从第一个到最后一个 都是bx  这样我就不用去管第几个内存存储的收入 只需要每次循环21就行了, 移动年份 循环21 移动收入 循环21 移动人数 循环21

我也想把他们放在一个大循环里 估计会少几行代码

其他都是一样的~ 共同学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-4 19:26:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-5 22:42:57 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2017-8-5 22:45:22 | 显示全部楼层
刘东方 发表于 2017-8-4 19:15
你好 楼主 我也做了这个 和你有些不同

table 我用的是ss, 这样就可以直接用 来当指针

厉害之前我怎么没想到呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-9 15:34:07 | 显示全部楼层
assume cs:codesge,ds:data,ss:stacksge

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'
        ;以上是表示21年的21个字符串
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上是表示21年公司总收入的21个dword型数据
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
        ;以上是表示21年公司雇员人数的21个word型数据
data ends

table segment
        db 21 dup ('year summe ne ?? ')
table ends

stacksge segment
        dw 0,0,0,0,0,0,0,0
stacksge ends

codesge segment
start:        mov ax,data
                mov ds,ax
                mov ax,table
                mov es,ax
                mov ax,stacksge
                mov ss,ax
                mov sp,16
                mov bx,0
                mov bp,0       
                mov di,0

                  mov cx,21
  
s:                push cx               
                mov cx,4
                mov si,0
                               
s0:                mov al,[bx][si]        ;第一行年份1
                mov es:[bp][si],al
                inc si
                loop s0

                pop cx
               
                mov ax,54h[bx]        ;第一行收入低16位
                mov dx,56h[bx]        ;第一行收入高16位
                mov es:5h[bp],ax
                mov es:7h[bp],dx

                mov ax,0a8h[bx]        ;第一行雇员数
                mov es:0ah[bp],ax

                mov ax,54h[bx]        ;第一行平均收入
                mov dx,56h[bx]
                div word ptr ds:0a8h[bx]
                mov es:0dh[bp],ax       

                add bp,16
                loop s

                mov ax,4c00h
                int 21h

codesge ends

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 18:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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