汇编语言随笔(7)-访问内存的寻址方式和实验7(不同寻址方式的使用)

寻址方式小结:

寻址方式 含义 名称 常用格式示例
[idata] EA=idata,SA=(ds) 直接寻址 [idata]
[bx],[si],[di] EA=(bx)或(si)或(di),SA=(ds) 寄存器间接寻址 [bx]
[bp] EA=(bp),SA=(ss) 寄存器间接寻址 [bp]
[bx+idata],[si+idata],[di+idata] EA=(bx)+idata或(si)+idata或(di)+idata,SA=(ds) 寄存器相对寻址 [bx+10]
[bp+idata] EA=(bp)+idata,SA=(ss) 寄存器相对寻址 [bp+10]
[bx+si],[bx+di] EA=(bx)+(si)或(bx)+(di),SA=(ds) 基址变址寻址 [bx+si]
[bp+si],[bp+di] EA=(bp)+(si)或(bp)+(di),SA=(ss) 基址变址寻址 [bp+si]
[bx+si+idata],[bx+di+idata] EA=(bx)+(si)+idata或(bx)+(di)+idata,SA=(ds) 相对基址变址寻址 [bx+si+10]
[bp+si+idata],[bp+di+idata] EA=(bp)+(si)+idata或(bp)+(di)+idata,SA=(ss) 相对基址变址寻址 [bp+si+10]

关于处理数据的长度

      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段中21年的数据按照填入table表中,其中人均收入需要计算。table表一共21行,每一行共计16字节,格式如下:

年份(4字节) 空格 收入(4字节) 空格 雇员数(4字节) 空格 人均收入(2字节) 空格

      程序如下:

	assume cs:code
	data segament
		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个字符串来表示年份
		dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
		dd 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,8226
		dw 11542,14430,15257,17800
		//用21个字型数据来表示公司每年的员工数量
	data ends
	
	table segment
		db 21 dup('year summ ne ?? ')
	table ends

	code segment
  start:mov ax,data
  		mov ds,ax		用ds来存放数据段的段地址
  		mov ax,table
  		mov es,ax		用es来存放table段的段地址
  		
  		mov di,0		di保存table中每一行的初始地址
  		mov bx,0		bx表示数据段起始的偏移地址。
  		mov al,21
  		mov dl,8
  		mul dl
  		mov si,ax		计算21*8的字节数,保存到si,这是雇员数在数据段的起始偏移地址
  		mov cx,21		外层循环次数21次
  		
  	 s: mov ax,[bx]
  	 	mov es:[di],ax
  	 	mov ax,[bx+2]
  	 	mov es:[di+2],ax
  	 	
  	 	mov ax,[bx+84]			bx+84为总收入的偏移地址
  	 	mov es:[di+5],ax
  	 	mov ax,[bx+86]
  	 	mov es:[di+7],ax
  	 	
  	 	mov ax,[si]
  	 	mov es:[di+10],ax
  	 	
  	 	mov dx,[bx+86]
  	 	mov ax,[bx+84]
  	 	div word ptr [si]				计算人均收入
  	 	
  	 	mov es:[di+13],ax
  	 	add di,10h
  	 	add si,2
  	 	add bx,4
  	 	loop s
  	 	
  		mov ax,4c00h
  		int 21h
  	code ends
 	end start

      注明:空格已经在table段给出,故没必要在程序在设置空格符了。关于用ax作为周转寄存器执行从内存到内存的数据传送,建议可以用栈来代替。关于乘除法的运算规则可以参考https://blog.csdn.net/Little_ant_/article/details/108149575

おすすめ

転載: blog.csdn.net/Little_ant_/article/details/108205577
おすすめ