【汇编语言】-第八章-实验七
个人有点笨,花的时间长了点,万幸还是解决了{:7_112:}开始时因为对data段中定义的字符串数据在内存中的表现形式产生了误解,不明白为什么‘1975’在内存中是:31,39,37,35, 后来才明白这是ASCII 码 {:5_109:} 还有一个重要疑问就是不明白在data段中定义的数据 比如年份,收入,雇员各占多少字节 编写代码的时候该如何定位这些数据。这个问题后来在我们亲爱的鱼C上看了很多鱼油以前的帖子在对着书本才一点点明白。所以真的很感谢各位鱼油们谢谢!
下面是写好的图片以及代码↓ 开始学不久,希望能和大家一起进步!
代码:
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
mov ds,ax ; ds = data
mov ax,table
mov es,ax ; es = table
mov bx,0 ; data偏移
mov si,2 ; 年份和收入的后2为偏移
mov bp,0 ; table行偏移
mov di,0 ; 雇员偏移
;年份写入
mov cx,21 ; 循环21次
s:mov ax, ;
mov es:,ax; 年份前2位给table
mov ax,;
mov es:,ax; 年份后2位给table
;收入写入
mov ax,
mov es:,ax; 收入前2位给table
mov ax,
mov es:,ax; 收入后2位给table
;雇员写入
mov ax,
mov es:,ax; 雇员给table
;人均写入
mov ax,es:
mov dx,es: ; 被除数(直接取得table段的收入值)
div word ptr es:
mov es:,ax ; 商存入table
add bx,4
add bp,10h
add di,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
{:9_240:} 新手,忙了一晚上终于解决了有点小激动。全无睡意第一时间来鱼C和小伙伴们分享下。 代码写的不好大牛不要笑话呵呵~ 希望小伙伴们多多交流共同进步 各位鱼油 晚安.... 不错,给你设置了高亮。小伙伴继续加油哇 wa 好牛逼 康小泡 发表于 2015-11-10 09:16
不错,给你设置了高亮。小伙伴继续加油哇
谢谢版主 langzi23 发表于 2015-11-10 10:03
wa 好牛逼
呵呵共同进步{:7_113:} 竟然有上首页啊{:5_95:} 本帖最后由 zph888 于 2015-11-13 12:12 编辑
在实验七这道”大作业“中,发现自己:1、偏移地址算错2、指令DBDDDW不熟悉 , DIV除法指令更是不明白3、DEBUG调试、内容查看没经过训练一知半解。
因为王爽老师,在我们没有练习除法的基础上,搞突袭布置大作业来检测学员的掌握前期学习的水平,因此初学者本人在不参考,不看鱼C老师实验七视频的情况下,用了5个循环,做了2天仍然只做对75%的内容了(除法死活做不出来)。
但通过封闭做题,确实收获不小,巩固了前8章,为后面9章扫清了障碍。
下面是搬了学友的题,来说明: 偏移地址直接用十进制数,可以减少手工换算时间。以供学友参考。
assume cs:code,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'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,11830000,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 summ ne ?? ')
table ends
codesegment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0 ;控制table行数
mov si,0
mov di,0
mov cx,21 ;循环21次
s: mov ax,ds:
mov es:,ax
mov ax,ds:
mov es:,ax ;传送年份,以字传送
mov ax,ds:
mov es:,ax
mov ax,ds:
mov es:,dx ;传送收入
mov ax,ds:
mov es:,ax ;传送雇员数,以字传送
mov ax,ds:
mov dx,ds:
div word ptr es: ;除法 32位÷16位,商保存在AX中
mov es:,ax ;AX传送到table中的人均收入
add si,2 ;控制雇员数递增,每循环一次,递加2
add di,4 ;控制年份、收入递增,每循环一次,递加4
add bx,16 ;每循环一次,移到下一行
loop s
mov ax,4c00h
int 21h
code ends
end start 实验七中,红框中数据应该程序运行后的数据
过来看看一起学习一起研究一下:smile:smile:smile:smile
页:
[1]