shuiyu 发表于 2017-8-2 01:27:50

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

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

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

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

;下面这一段实现存放总收入
                mov ax,                ;总收入段开始于54H,且定义时使用的是dd(双字型数据),
                                                        ;故使用ax存放低字节,dx存放高字节
                mov dx,                ;bx每次循环加4实现读取到下一年份的总收入
                mov es:,ax                ;在table段中,存放总收入的是在5-8h段,
                                                        ;所以把ax放到5、6中,dx放到7、8中
                mov es:,dx                ;di每次循环加16实现存放到table段中的换行。
               
;下面这一段实现存放总人数
                mov ax,                ;总人数开始于A8H,且定义时使用的是dw(字型数据),
                                                        ;故每次加2就可以取到下一个年份的总人数
                                                        ;因为在源程序中不能使字母开头,所以在前面加一个0.
                mov es:,ax                ;在table段中,存放总人数的是在A-BH段,所以把ax存放到0AH中
                                                        ;di每次循环加16实现存放到table段中的换行。
               
;下面这一段实现计算人均收入与存放人均收入
                mov ax,                ;总收入/总人数=人均收入。故读取存放在54H开始的总收入,
                                                        ;为使用div做准备
                mov dx,               
                div word ptr ds:0a8h        ;总收入/总人数=人均收入。
                mov es:,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
               
下面的是图解(排版好看一点{:5_109:} ):
一,图解




二、成功编译链接执行


谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}


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

圆冶治 发表于 2017-8-2 15:20:44

虽然看不太懂,但也要赞一个赞一个{:10_256:}

shuiyu 发表于 2017-8-3 22:45:37

圆冶治 发表于 2017-8-2 15:20
虽然看不太懂,但也要赞一个赞一个

额。。。是我表达得不清楚,还是你不懂?{:5_99:}我得改正错误{:5_109:}

圆冶治 发表于 2017-8-4 10:41:04

shuiyu 发表于 2017-8-3 22:45
额。。。是我表达得不清楚,还是你不懂?我得改正错误

只是我不懂而已{:10_315:}

刘东方 发表于 2017-8-4 19:15:02

你好 楼主 我也做了这个 和你有些不同

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

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

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

其他都是一样的~ 共同学习

刘东方 发表于 2017-8-4 19:26:46

http://bbs.fishc.com/forum.php?mod=viewthread&tid=93643&extra=page%3D1%26filter%3Dtypeid%26typeid%3D379

这个是我写的 欢迎提意见

shuiyu 发表于 2017-8-5 22:42:57

圆冶治 发表于 2017-8-4 10:41
只是我不懂而已

{:10_258:}

shuiyu 发表于 2017-8-5 22:45:22

刘东方 发表于 2017-8-4 19:15
你好 楼主 我也做了这个 和你有些不同

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


厉害{:5_106:}之前我怎么没想到呢{:10_250:}

panzhen 发表于 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,        ;第一行年份1
                mov es:,al
                inc si
                loop s0

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

                mov ax,0a8h        ;第一行雇员数
                mov es:0ah,ax

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

                add bp,16
                loop s

                mov ax,4c00h
                int 21h

codesge ends

end start
页: [1]
查看完整版本: 《零基础入门学习汇编语言》对实验七深入学习