汇编语言第八章知识点及实验7答案

汇编语言第八章知识点及实验7答案

再进入本章之前,需要先明白两个新的知识点:
reg表示寄存器(ax,bx,al,ah等),sreg表示段寄存器

8.1 bx,si,di和bp

在本书介绍的8086cpu里只能用 bx,si,di和bp四个寄存器来表示内存单元的地址,我们需要注意的是bx和bp,si和di不能一起搭配使用,例如下面的是错误的:

mov ax,[bx+bp]
mov ax,[si+di]

而且bp这个寄存器我们需要特别注意,如果出现了bp那么我们默认是在栈(ss)中,而其他的寄存器默认的都是ds

8.2机器指令处理的数据在什么地方

机器指令主要分为三类:读取,写入,运算。
指令执行时,最重要的是需要知道它将要执行的内容所在地址

8.3数据位置的表达

8.4寻址方式

8.5指令要处理的数据有多长

机器处理我们编写的指令,该怎么判断处理的是字操作还是字节操作呢?
书上提供了两种判断方法:

1.根据指令中出现的寄存器判断:
如果出现的是ax,bx,cx,进行的是字操作
如果出现的是al,bl,cl,则进行的是字节操作
2.根据操作符X ptr来判断:
word ptr -->字操作
byte ptr -->字节操作

有的指令默认进行字操作,如push和pop指令,不允许字节进栈

8.6寻址方式的综合应用

8.7 div指令

add-->加法指令
sub-->减法指令
mul-->乘法指令
div-->除法指令

我们需要学习的是关于使用div指令的时候数据的存放位置!

我们根据除数的位数来判断被除数
如果除数8位,则被除数16位,被除数存放在AX中
如果除数16位,则被除数32位,被除数的高位放在DX中,低位放在AX中
我们根据除数的位数来决定结果的存放位置
如果除数是8位,则al存放结果,ah存放余数
如果除数是16位,则ax存放结果,dx存放余数

8.8伪指令dd

在这里我们介绍一个新的的定义数据的伪指令dd

db -->定义字节型数据
dw -->定义字型数据
dd -->定义双字型数据

故如果出现了dd 1,表示的含义是定义的数据为00000001H,占4个字节

8.9 dup

dup和上面的db,dw,dd等伪指令搭配使用,用来进行数据的复制
比如我们要一次性定义200个字节单位的空间,如果在db后面输入200个0特别麻烦,这个时候我们可以用:

db 200 cup(0)

就可以起同样的效果了,格式如下:

db/dw/dd 重复的次数 cup (重复的内容)

实验七

assume cs:codesg,ss:stacksg,ds:datasg,es:table
stacksg segment
	dw 0,0,0,0,0,0,0,0    ;定义栈来储存cx的值
stacksg ends

datasg 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      ;总收入

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
	dw 11542,14430,15257,17800   ;公司的雇佣人数
datasg ends

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

codesg segment
start:mov ax,datasg
	mov ds,ax
	mov ax,stacksg
	mov ss,ax
	mov sp,16
	mov ax,table
	mov es,ax                              
	                                             ;先用循环把前面两个都是4字节的内容复制到表格中,然后再用循环另外将人数和平均工资复制上去
	mov cx,2                          ;年份和收入
	mov di,0                           ;di指向datasg的内容
	mov bx,0                           ;bx指向表格,bx=0表示现在定位到第一行第一个地址,bx=5表示定位到第一行第五个字节,如果要换行只需要加16即可
	
s1: push cx                            ;将第一层循环的cx放入栈中,方面将第二层循环的值赋给cx
	mov cx,21                          ;因为我们一共有21行,每一行循环一次

s2:push cx                             ;将第二层循环的cx放入栈中,方面将第三层循环的值赋给cx
	mov cx,2                           ;因为4字节的话我们用bx寄存器进行操作是字操作也就是2字节,需要进行两次才能完整复制1个数据

s3:mov si,0                            ;用来更精准的定位地址
	mov es:[bx+si],ds:[di]
	add si,2
	mov di,2
	loop s3
	
	pop cx                             ;结束完复制一个地址,准备换行
	add bx,16
	loop s2

	mov bx,5
	pop cx
	loop s1                            ;到这里我们已经把前两组的地址全部复制完了

	mov bx,10
	mov cx,21

s4:mov es:[bx],ds:[di]
	add bx,16
	add di,2
	loop s4                            ;复制完人数的内容,开始算人均

	mov cx,21
s5:mov DX,es:[bx+5]
	mov ax,es:[bx+7]
	div es:[bx+10]
	mov es:[bx+13],ax                  ;不太懂得话建议去复习一下div指令
	add bx,16
	loop s5

	mov ax,4c00h
	int 21h
codesg ends
end start


;这就是我写的实验七得答案,不过没有调试建议只供参考,当然有错的话很乐意指出!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值