《零基础入门学习汇编语言》对实验七深入学习
本帖最后由 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:}
虽然看不太懂,但也要赞一个赞一个{:10_256:} 圆冶治 发表于 2017-8-2 15:20
虽然看不太懂,但也要赞一个赞一个
额。。。是我表达得不清楚,还是你不懂?{:5_99:}我得改正错误{:5_109:} shuiyu 发表于 2017-8-3 22:45
额。。。是我表达得不清楚,还是你不懂?我得改正错误
只是我不懂而已{:10_315:} 你好 楼主 我也做了这个 和你有些不同
table 我用的是ss, 这样就可以直接用 来当指针
移动年份的时候 可以直接把数据写到AX 里面 这样就一次移动一个字, 而不是一个字节
我试着想一次移动两个字 但是好像不支持
还有一点 我用的bx 当 data的指针 数据从第一个到最后一个 都是bx这样我就不用去管第几个内存存储的收入 只需要每次循环21就行了, 移动年份 循环21 移动收入 循环21 移动人数 循环21
我也想把他们放在一个大循环里 估计会少几行代码
其他都是一样的~ 共同学习
http://bbs.fishc.com/forum.php?mod=viewthread&tid=93643&extra=page%3D1%26filter%3Dtypeid%26typeid%3D379
这个是我写的 欢迎提意见 圆冶治 发表于 2017-8-4 10:41
只是我不懂而已
{:10_258:} 刘东方 发表于 2017-8-4 19:15
你好 楼主 我也做了这个 和你有些不同
table 我用的是ss, 这样就可以直接用 来当指针
厉害{:5_106:}之前我怎么没想到呢{:10_250:} 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]