寻址方式小结:
关于处理数据的长度
1,通过寄存器来指明要处理数据的尺寸。如mov ax,[bx]和mov al,[bx]分别针对的是内存中的字节单元和字型数据。
2,在没有寄存器的情况下,可以用数据长度 ptr的格式来指明,其中数据长度可以为byte或word,分别表示字节和字。如下面几种操作表示操作的是字型数据:
mov word ptr ds:[0],1可将数据直接传送到字型内存单元。
inc word ptr ds:[0]
add word ptr [bx],1
对字节单元的数据采用 byte ptr。
3,在push和pop中不需要指明内存单元的长度,因为只能是字型数据。如:push ds:[0]
实验7
将data段中的数据按照填入table表中,其中人均收入需要计算。table表一共21行,每一行共计16字节,格式如下:
程序如下:
assume cs:codedata segamentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995'//用21个字符串来表示年份dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 245980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000//用21个双字型数据来表示公司每年的总收入dw 3,7,9,13,28,38,130,220,476,778,100,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800//用21个字型数据来表示公司每年的员工数量data endstable segmentdb 21 dup('year summ ne ?? ')table endscode segmentstart:mov ax,datamov ds,ax用ds来存放数据段的段地址mov ax,tablemov es,ax用es来存放table段的段地址mov di,0di保存table中每一行的初始地址mov bx,0bx表示数据段起始的偏移地址。mov al,21mov dl,8mul dlmov si,ax计算21*8的字节数,保存到si中,这是雇员数在数据段的起始偏移地址mov cx,21外层循环次数21次s: mov ax,[bx]mov es:[di],axmov ax,[bx+2]mov es:[di+2],axmov ax,[bx+84]bx+84为总收入的偏移地址mov es:[di+5],axmov ax,[bx+86]mov es:[di+7],axmov ax,[si]mov es:[di+10],axmov dx,[bx+86]mov ax,[bx+84]div word ptr [si]计算人均收入mov es:[di+13],axadd di,10hadd si,2add bx,4loop smov ax,4c00hint 21hcode endsend start
注明:空格已经在table段给出,故没必要在程序在设置空格符了。关于用ax作为周转寄存器执行从内存到内存的数据传送,建议可以用栈来代替。关于乘除法的运算规则可以参考/Little_ant_/article/details/108149575