汇编语言第八章知识点及实验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
;这就是我写的实验七得答案,不过没有调试建议只供参考,当然有错的话很乐意指出!