一
逻辑运算

5.非运算:0为1,1为0
汇编:not c语音:!
计算机的计算2+3运算(cpu)
汇编语言的2➕3的计算
两个16进制数代表一个字节
一个位存储一个1和0
寄存器与内存
CPU里的存储容器为寄存器,
内存条里的存储容器为内存
1.寄存器
通用寄存器
16位是在32位的寄存器里,8位在16位 里(32,16,8都是指的能存多少个0或1,即二进制)
一个16进制数用四位二进制数表示
如图:
1.mov指令
2.ADD-加法,SUB-减法。
MOV EAX, 12345678 //1234678为立即数
ADD EAX,1 //EAX加上1,并放到EAX里(EAX+1=EAX)
MOV ECX,2
ADD EAX,ECX
SUB EAX,3 //EAX-3=EAX
3.and
4.xor
2.内存
1.32位指内存里的寻址条最大寻址范围(最大寻址宽度{编号},即0xfffffffff)
也是指4g,但也可以超过4g.
2.每个内存单元的宽度为8(16位制,为一个字节
byte 字节=8(bit) 1kb=1024byte
word 字=16(bit) 1mb(兆=1024kb
dwoed 双字=32(bit) 1gb=1024mb
3.在汇编中内存编号要加[],且要规定内存宽度
mov dword ptr DS:[0x0012f5f4],0x12345678 //ptr提示后面是内存编号
sub eax,4 //eax减4
寻址公式:
1.立即数
读取内存的值
MOV EAX,DWORD PTR DS:[0X13FFC4] //dword--32位
MOV EAX,DWORD PTR DS:[0X13FFC8]
向内存写入数据
MOV DWORD PTR DS:[0X13FFC4],0x87654321
MOV DWORD PTR DS:[0X13FFC8],ebx
获取内存编码
LEA ECX,DWORD PTR DS:[0X13FFC4]
LEA EAX,DWORD PTR DS:[ESP+8]
2.用寄存器表示地址
读取内存值
MOV ECX,0X13FFC4 //把地址放进ECX里
MOV EAX,DWORD PTR DS:[ECX]
3.寄存器+立即数
读取内存值
MOV ECX,0X13FFC4
MOV EAX,DWORD PTR DS:[ECX+4] //取得是0x13FFC8
4.[reg+reg*i] //reg指寄存器,i为1,2,4,8
MOV EAX,0X13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4] //0X13FFC4+(2*4)
5.[reg+reg*i+立即数] //i为1,2,4,8
MOV EAX,0X13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4] //0X13FFC4+(2*4)+4
堆栈
1.本质为内存
2.栈 是用来存储临时变量,函数传递的中间结果
栈顶(esp),栈底(ebp)
入栈(push),出栈(pop)——地址都是改变esp
3.
push
立即数(push 1.....)———永远都是减四(不能超过32位
push 寄存器(push ax )———不能用八位寄存器(16位是减二,32位减四
push 内存(push dword ptr ds :[0x12FFDA])———(dword—减四,word—减二
esp减四,并将内存里的值存入栈顶
pushad
esp向后移,并且将八个寄存器里的值存入了内存中
popad恢复
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步