内存地址
一:寄存器的结构_eax与ax,ah,al的关系
eax分一半是ax,ax内部左边是ah,右边是al。即这样的关系。修改al的值ax也会变,eax也会变。
注意:8位寄存器只能存放两个16位数,因为一个8位寄存器存放8位二进制数,1位16进制数等于4位二进制数。
二:窗口介绍
编号:
修改指定内存中的数据:
注意:前面定义的类型(如byte,word,dword)要与后面的存入数据的宽度一致。如果存入的是word类型,而一个存储单位只能存一个字节,那么会依次顺延,更改存储单位数据数据。
存入word类型到D8中,D9数据
LEA指令:取地址
将12FFC4的地址传入EAX中(后来用于间接取址,当括号内的值是变量时想得到地址需要进行此操作)
指令+存入的地址+数据宽度+PTR DS:[要取数据的地址](???)
补充:如何不修改代码改值
此时是将ECX的地址所指向的变量取出(???)
取地址方法总结:
1:直接放地址编号
2:将地址放到寄存器中,通过寄存器找内存
LEA指令执行完后ECX的值等于EAX的值
MOV指令是将值取出,LEV指令是取出地址。
其他寻址方式:
(方括号内的会有寄存器的计算,但只能是(reg+reg*(1,2,4,8)+立即数形式。
三:堆栈
临时存放数据,方便读入和取出
可以记录存储多少数据
能够快速找到存储的数据
采取基础地址=段地址*16+偏移地址方式找到地址。例如:base+...或者top+...(其中base和top是任意两个寄存器)
当不需要这组数据时,将top下移
如何存储(实际操作):
开始可以将栈底和栈顶存到同一位置
存入数据:地址=栈顶位置-数据宽度 (为什么是-数据宽度?因为window中是向低位拓展,即栈底高于栈顶)
修改栈顶的值
此方法是先存数据再移栈顶的位置,也可以先移栈顶位置,再存数据。
先移栈顶值,再存数据,此时存入存入数据到寄存器中不需要再-数据宽度。
如何弹出数据?
先取出数据到其他寄存器后再将移地址(也可以先移地址再取数据)
其他存储数据,弹出数据指令:
push指令:将数据存入cpu中常用的存储堆栈的寄存器esp(栈顶)中(ebp栈底)
pop指令:将数据弹出。例如:pop eax 是将数据弹出并存储到eax中。
内存地址
一:寄存器的结构_eax与ax,ah,al的关系
eax分一半是ax,ax内部左边是ah,右边是al。即这样的关系。修改al的值ax也会变,eax也会变。
注意:8位寄存器只能存放两个16位数,因为一个8位寄存器存放8位二进制数,1位16进制数等于4位二进制数。
二:窗口介绍
编号:
修改指定内存中的数据:
注意:前面定义的类型(如byte,word,dword)要与后面的存入数据的宽度一致。如果存入的是word类型,而一个存储单位只能存一个字节,那么会依次顺延,更改存储单位数据数据。
存入word类型到D8中,D9数据
LEA指令:取地址
将12FFC4的地址传入EAX中(后来用于间接取址,当括号内的值是变量时想得到地址需要进行此操作)
指令+存入的地址+数据宽度+PTR DS:[要取数据的地址](???)
补充:如何不修改代码改值
此时是将ECX的地址所指向的变量取出(???)
取地址方法总结:
1:直接放地址编号
2:将地址放到寄存器中,通过寄存器找内存
LEA指令执行完后ECX的值等于EAX的值
MOV指令是将值取出,LEV指令是取出地址。
其他寻址方式:
(方括号内的会有寄存器的计算,但只能是(reg+reg*(1,2,4,8)+立即数形式。
三:堆栈
临时存放数据,方便读入和取出
可以记录存储多少数据
能够快速找到存储的数据
采取基础地址=段地址*16+偏移地址方式找到地址。例如:base+...或者top+...(其中base和top是任意两个寄存器)
当不需要这组数据时,将top下移
如何存储(实际操作):
开始可以将栈底和栈顶存到同一位置
存入数据:地址=栈顶位置-数据宽度 (为什么是-数据宽度?因为window中是向低位拓展,即栈底高于栈顶)
修改栈顶的值
此方法是先存数据再移栈顶的位置,也可以先移栈顶位置,再存数据。
先移栈顶值,再存数据,此时存入存入数据到寄存器中不需要再-数据宽度。
如何弹出数据?
先取出数据到其他寄存器后再将移地址(也可以先移地址再取数据)
其他存储数据,弹出数据指令:
push指令:将数据存入cpu中常用的存储堆栈的寄存器esp(栈顶)中(ebp栈底)
pop指令:将数据弹出。例如:pop eax 是将数据弹出并存储到eax中。