欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-02 15:46:04
...

寻址方式小结:

寻址方式 含义 名称 常用格式示例
[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