x86汇编语言之内存数据的读写

546 阅读3分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

对内存中的数据进行读写

从内存中一次读取数据的多少,取决于寄存器的容器大小

data segment
	str dw 'hello'  ;如果定义多个数据 使用逗号进行分隔
 data ends

start:
	mov ax,data
	mov ds,ax
	mov ax,str  ;如果从内存中读取数据,是根据寄存器大小来读取,16位寄存器则一次性读取16位数据,8位al则一次性读取八位数据

end start

思考:为什么以下写法报错:

;报错1
data segment
	str db 'hello ' ;改成dw则不报错
data ends
start:
mov ax,data
	mov ds,ax
	mov ax,str  ;

end start

;报错2
data segment
	str dw 'hello ' 
data ends

start:
	mov ax,data
	mov ds,ax
	mov al,str  ; ;改成mov ax,str 或者mov al,b.str 则不报错

end start



;报错3
mov ax,bl   ;宽度不匹配  以上两个也是同样的问题

内存数据的读写是从低往高进行读写

上面使用db或者dw定义数据的方式,定义数据的同时就已经定义好了数据所在的物理地址, 如果我们想要从指定的内存地址中写入或者读取数据的话,需要借助段寄存器来实现 在8086中给我们提供了DS SS CS ES四个寄存器,理论上你使用哪一个都行,但是由于系统默认读取DS寄存器中的数据当做段地址,所以我们一般使用DS进行数据的段地址管理

  • 如何从指定内存中读取数据

    ;假设我们需要从0710:0000这个物理地址中读取数据,然后存放到寄存器中
    
    ;错误写法1:
    start:
    	mov ax,0710H:0000H  ;没有这种语法
    end start
    
    
    ;错误写法2:
    start:
    	mov ds,0710H   ;段寄存器不能直接赋值,必须借助通用寄存器
    	mov ax,ds:[0]
    end start
    
    ;正确写法:
    start:
    	mov ax,0710H
    	mov ds,ax
    	mov ax,ds:[0]  ;实际物理地址 段地址+偏移地址 ===>ds:[xxx] 表示从该地址取数据
    end start
    
    
  • 如何往指定内存中写入数据

    ;假设我们需要将数据写入0710:0000这个物理地址中
    
    ;错误写法1:
      start:
      	mov ax,3333H
      	mov 0710:0000,ax  ;没有这种语法
      end start
    
    
      ;错误写法2:
      data segment
      	str dw 'he'
      data ends
    
      start:
      	mov ax,data
      	mov ds,ax   
      	mov ds:[0],ds:str ;必须借助通用寄存器进行赋值
      end start
    
      
    
      ;正确写法1:
      data segment
      	str dw 'he'
      data ends
    
      start:
      	mov ax,data
      	mov ds,ax   
      	mov ax,ds:str ;str-==>[xx] ds:[xxx]
      	mov ds:[0],ax 
      end start
    
      ;正确写法2:
      start:
      	mov ax,0710H 
      	mov ds,ax;指定需要写入数据的段地址
      	
      	mov ax,3333H ;将3333H当做数据
      	mov ds:[0],ax  
      end start
      
    ;正确写法3:
      start:
      	mov ax,0710H 
      	mov ds,ax;指定需要写入数据的段地址
      	
      	mov ds:[0],3333H  ;可以直接将数据写入 最多写入十六位的数据
      end start
    

补充:往内存中写入数据是字节宽度还是字型宽度取决于寄存器的宽度也就是 mov ds:[0],ax 或者数据的大小:mov ds:[0] 30H

; 以下是指定数据占用空间的大小 可以实现8位数据占用16个字节的空间的目的

 mov byte ptr ds:[0],1 ;前面加上byte ptr关键字 表示往指定内存中写入字节型数据1
 
 mov word ptr ds:[0],1 ;往指定内存中写入字型数据1 也就是在内存中占用两个字节空间