汇编语言基础2
程序员文章站
2024-02-02 16:43:34
...
1,数据传送指令
mov ebx,12340000h ;将值0x1234000赋给ebx
mov eax,[004010000h];将内存地址为0x00401000处的值赋给eax
mov eax,ebx ;将ebx里的值赋给eax
mov [004010000h],12345678h ;将值(0x12345678)赋给内存地址0x00401000
mov [00401000h],ecx ;将寄存器ecx的值赋给内存地址0x00401000
xchg eax,ebx ;交换eax与ebx里的数据
xchg [00401000h]m,ecx;交换ecx与地址0x00401000处的数据
xchg eax,[00401000h]
push 指令将一个操作数压入堆栈,esp寄存器的值会减4,esp始终指向栈顶。pop指令的效果和它相反。
lea (load effective address)指令,即装入有效地址。它对地址进行操作,而不是数据。
lea edi,[ebp+0000000ch] ;将地址(ebp+0xc)赋给edi寄存器(edi=ebp+0ch)。
2,算术运算指令
(1)add 指令是加法指令,sub指令使用与add相似。使用如下:
add eax,ecx ;将两个寄存器的值相加,然后赋给eax
add ebx,123 ;相当于c里的,ebx=ebx+123
add [00402000h],eax ;将地址为(00402000h)处的值加上eax里的值,赋给该地址
(2)adc是带进位的加法,在语法上是一样的,只是adc指令在进行了add指令的操作后还要加上CF(carry falg进位标志)值。sbb是带进位的减法。
adc eax,123 ;相当于eax=eax+123+CF
sbb ebx,11 ;ebx=ebx-11-CF
(3)inc与dec,用于给操作数加一或减一。
inc ecx ;eax=eax+1
inc dword ptr [00402000h];地址(00402000h)指向双字(dword)的变量,将该变量值加一
(4)mul/imul/div/idiv 无符号/有符号乘法,无符号/有符号除法指令 。
mul ecx ;当操作数长度为dword(4字节),进行的操作为edx:eax=eax*ecx,将eax与ecx的值相乘,结果的低32位放在eax,高32位放在edx,防止超过数值范围
mul bh ;操作数长度为byte(1字节),ax=al*bh
mul bx ;长度为word(2字节),dx:ax=ax*bx
imul bl/bx/ebx ;与mul指令相同
imul reg1,reg2/mem ;reg1=reg1*reg2/mem
imul reg1,reg2/mem,imm ;reg1=reg2*imm,imm是立即数
div cl ;ax/cl,商放在al,余数放在ah
div cx ;dx:ax/cx,商放在ax,余数放在dx
div ecx ;edx:eax/ecx,
mov dl,3 ;cl=3
mov eax,0ah ;eax=0xa
div cl ;ax/cl=10/3=3,al=3,ah=1
3,位运算指令
and eax,7 ;与运算,eax=eax&7,(7&1)=1,(7&4)=4,(7&16)=0,将操作数换成二进制,对应位进行与操作
or ecx,0ffffffffh; 或运算,ecx=ecx|0xfffffff
xor ax,ax ;异或运算,ax=ax^ax
not esi ;非运算,esi=~esi
shl ch,4 ;向左移4位,ch=ch<<4,相当于乘以16
shr ecx,1 ;向右移1位,ecx=ecx>>1,相当于除以2
rol al,3 ;al循环左移3位
ror al,1 ;al 循环右移1位。当al=0x41,循环右移1位,(01000001)->(10000010),al=0x82
上一篇: 谁在用Hadoop?