这一章将解说汇编对内存的操作.我之前说过,内存操作需求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