微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第9章 内存操作(X86汇编教程)

第9章 内存操作(X86汇编教程)

时间:12-01 来源:互联网 点击:
这一章将讲解汇编对内存的操作.我之前说过,内存操作需要2个地址.段地址和偏移地址.段地址一般放在段寄存器里,在186里面,以S结尾的寄存器就叫段寄存器(0_0!请不要急着写代码测试...),但不是每个段寄存器都能随便改的.为什么呢?我说过:代码也是在内存里的,也就是说,需要一个段寄存器 和一个偏移寄存器来指向我们的代码,还有栈(不是本章内容),那也是一个内存地址,也需要段寄存器和一个偏移寄存器.(我可没说偏移地址放在偏移寄存器里,实际上我们操作内存很少用到偏移寄存器!)

代码地址的段寄存器为CS,偏移寄存器为IP

栈,段寄存器:SS,偏移寄存器:SP

恩,也就是说,CS和SS这2个段寄存器不能随便改.

好了,接着说如何往段寄存器里写入段地址了.说到这里不得不说CPU的一些蛋疼的地方了.暂时先说2处:

1:一般的数据操作指令,需要2个寄存器操作数的时候,不能放2个位数不同的寄存器.比如下边的代码是行不通的:

MOV AX,BL

2:X86有一个缺陷:不能直接MOV 段寄存器,数字,需要拿其它寄存器做中转

这样是不对的:

MOV DS,1800H;X

要这样:

MOV AX,1800H

MOV DS,AX;√

这样才能把1800H写入到DS寄存器里

好了,段地址说完了,说偏移地址,这个偏移地址,载体比较多.能用部分寄存器或用直接数(就是直接上数字).

还记得内存地址算法吗?没错,就是把段地址乘以16(这里的16是10进制的哟!),加上偏移地址!

在NASM汇编中,操作数为内存值的时候,用这种方式表示(把某数值写入内存的语法↓):

MOV 要操作的数值类型 [段地址:偏移地址],数值

实例:

MOV BYTE

可见,在汇编中,用方括号表示这个操作数是内存某地址,方括号里表示地址.在指令后边,用英文单词表示要操作的数据类型.防止移动多余数据到内存里.

类型:

BYTE:字节形

WORD:字形

DWORD:双字型(186用不着,因为没这么长的寄存器)

好了,试试看吧,我们往12345H地址写个数字进去看看:

MOV AX,1234H

MOV DS,AX

MOV BX,0005H

MOV BYTE [DS:BX],00H

编译执行看看.

作业:把内存0000H~0004H处全部写入00H

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top