1 nop 指令
定义:不执行任何操作。

2 现场保护指令
2.1 push 与 pop
push:入栈。
pop:出栈

2.2 pushad 与 popad
定义:对寄存器的现场保护
pushad相当于如下8条指令:
push eax
push ecx
push edx
push ebx
push esp
push ebp
push esi
push edi 最顶指向
popad作用则相反
2.3 pushfd 与 popfd
定义:是对标志位进行的现场保护

3 内存操作
3.1 mov指令
定义:对操作数进行赋值,操作数可以是寄存器、数值、间接寻址的内存数据。
mov eax,0x1
mov dword [44907D],1
mov al,dh
mov byte [449086],0xff
3.2 movsx 与 movzx
- movsx:带符号扩展,并传送
- movzx:无符号扩展,并传送
movsx eax,cx
movzx eax,cx
# 8位扩展到32位
movzx eax,ax


4 lea 指令
定义:去内存地址(非数据)
(需继续研究)

5 xchg 指令
定义:交换指令
与内存交换
xchg eax, [449080]
与寄存器交换
mov eax,0x1
mov ecx,0x2
xchg eax,ecx

6 算数运算指令
6.1 add 与sub指令
add
:加法指令,2个操作数相加,结果返回给第1个操作数。
mov eax,0x5
mov ecx,0x7
add eax,ecx
# 低8位+1
add al,0x1
还可以和地址相加,但是这里测试未通过
mov eax,0x1
add eax, [40190]

sub
:减法指令,2个操作数相减,结果返回给第1个操作数。
mov eax,0x9
mov ecx,0x6
sub eax,ecx
sub ax,0x1

6.2 adc 与 sbb 指令
adc
:与add不同的是,它需要额外加上cf进位标志位寄存器的值。
令 cf=1
mov eax,0x3
mov ecx,0x2
adc eax,ecx
结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1

sbb
:与sub不同的是,它需要额外减去cf进位标志寄存器的值。
令 cf=1
mov eax,0x3
mov ecx,0x2
sbb eax,ecx
结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1

6.3 inc 与 dec 指令
inc
:该指类似于 C语言中的 i++或者i=i+1。
mov eax,0x2
inc eax

deg
:递减

6.4 cdq、mul 与 div 指令
cdq
:扩展,它是将eax扩展成 edx:eax
mul
:乘法指令,对操作数进行乘法运算,结果放在eax,如果溢出则扩展存放到edx。
mov eax,0x2
mov ecx,0x3
mul ecx


mov eax,0x5
mov ecx,0x3
cdq
div ecx
div
:除法指令,对操作数进行除法运算,根据多少位的寄存器而不同存放的商和余数的位置也不同。

cl 低8位做除数,商在al存储,余数在ah存储。
mov eax,0x5
mov ecx,0x3
cdq
div cl

6.5 imul 与 idiv 指令
imul
:也是乘法指令,却别在它有多个操作数,并且溢出直接舍去溢出的值。
操作数位3个的时候,第一个寄存器作为存储结果使用。

idiv
:跟imul一样,有多个操作数,丢弃溢出。
6.6 xadd 与 neg 指令
xadd
:互换并相加指令,结果返回第1个操作数。
mov eax,0x2
mov ecx,0x3
xadd eax,ecx
xadd eax,ecx
相当于
xchg eax,ecx
add eax,ecx

neg
:指令取反指令。
mov eax, 6
neg eax
7 位运算指令
7.1 and 与
and
为逻辑 与 运算,通过位运算得出结果。
3 0011
5 0101
0001
mov eax,0x3
mov ecx,0x5
and eax,ecx

7.2 or 或
or
:逻辑 或 运算,通过位运算得出结果。
只要有1,则为1;2个都为0则为0
3 0011
5 0101
---------
7 0111
mov eax,0x3
mov ecx,0x5
or eax,ecx

7.3 xor 异或
xor
:逻辑异或运算,通过位运算得出结果。
3 0011
5 0101
---------
7 0110 6h
mov eax,0x3
mov ecx,0x5
xor eax,ecx

7.4 not 取反
not
:逻辑取反运算,通过位运算得出结果。
3 0000 0000 0000 0000 0000 0000 0000 0011
---------
7 11111111111111111111111111111100
mov eax,0x3
not eax
8 比较指令
8.1 cmp 比较
cmp
:比较指令,2个操作数,通常是比较2个值是否相等,影响标志位寄存器。
与sub指令不同的是,cmp指令不存储结果。
mov eax, 0x1
mov ecx, 0x2
cmp eax,ecx
8.2 test 逻辑比较
test
:比较指令,2个操作数,类似于逻辑与运算,但是结果不进行赋值,而是影响标志位寄存器,达到跳转指令的目的。
mov eax,0x0
test eax,eax zf 为1
je 44908f 跳转
mov eax,0x2
test eax,eax zf 为0
je 44908f 不跳转
9 跳转类指令
9.1 jmp 无条件跳转
jmp
:无条件跳转,不根据标志位来改变程序逻辑。
jmp 00449087

9.2 je 与 jz 相等跳转
定义:je与jz根据 zf 标志位来进行跳转,
注释:je与jz相同
mov eax,0x1
mov ecx,0x2
cmp eax,eax
je short 0044908F

9.3 jne 与 jnz 不相等跳转
定义:jne 与 jnz 根据 zf 标志位来进行跳转
mov eax,0x1
cmp eax,eax
jne short 0044908F
补充
jnz与je写到一起相当于无条件跳转jmp
mov eax,0x1
cmp eax,eax
jne 0044908F
je 0044908F
9.4 js 负数 跳转
定义:js如果结果为负数时,sf置1
mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2=-1
js 44908F 跳转

9.5 jns 正数 跳转
定义:如果比较结果为正数,SF置0
9.6 jp[jpe] 偶 跳转
定义:如果比较结果(二进制1的个数)为偶数时,PF置1
mov eax,0x4
mov ecx,0x1
cmp eax,ecx 4-1=(3)d=(0011)o
jp 44908F 1为偶数个,跳转
9.7 jnp[jpo] 奇 跳转
定义:如果比较结果(二进制1的个数)为奇数时,PF置0
9.8 jo 溢出跳转
定义:jo为溢出标志位跳转指令
以32位举例如下:
最大正数:7FFFFFFF~2147483647(有符号)
mov eax,0x7FFFFFFF
add eax,0x1
jo 0044908F

9.9 jb 无符号 产生进位跳转
定义:比较后,如果第一个操作数 < 第2个操作数,CF置1
mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2,产生借位,CF=1
jb 00449091 跳转

9.9 jnb 未产生进位跳转
定义:2个操作数比较,第一个操作数 > 第二个操作数,CF置0
mov eax,0x2
mov ecx,0x1
cmp eax,ecx 未产生借位,CF=0
jb 00449091 不跳转
9.9 jbe C和Z标志位跳转
定义:操作数1 < 操作数2 的时候,
CF:进位标志位(产生进位/错位时,CF=1)
ZF:零标志位(运算结果为0时,ZF=1)
9.9 jnbe[ja] C和Z标志位跳转
定义:操作数1 > 操作数2 的时候
9.10 jl 有符号 S标志位跳转
jl与jb类似的是 比较 操作数1 < 操作数2 的跳转,但主要根据SF(符号)标志位跳转。
mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2<0 则 SF=1
jl 499091 实现跳转
10 函数call指令
类似于jmp指令,但它主要用于调用一个子程序或函数。
call 地址
retn
11 循环类指令
11.1 跳转实现
xor eax,eax
mov ecx,0x5
dec ecx
test ecx,ecx
jnz 00449087

11.2 loop指令
定义:根据寄存器 ECX值,递减直到为1时,不在继续循环。
xor edx,edx
mov ecx,0x5
inc edx
nop
nop
loopd 00449097
loopd:32位
loopw:16位

12 寻址方式
12.1 直接寻址
根据直接看到的指令干的什么,就是直接寻址
push 0x123456
mov eax,0x2
inc eax
dec ebx
mov ecx,0x3
add eax,0x5
push eax
12.2 间接寻址
肉眼看的话,不知道结果,通过CPU运行到此处,才能得出结果

参考地址:
https://www.bilibili.com/video/BV135411u7HR
<h2><a id="1_nop__1"></a>1 nop 指令</h2>
<p>定义:不执行任何操作。</p>
<p><img src="https://static.couragesteak.com/article/29beef3fb517c3f8d83636c9757f053a.png" alt="2754d6921c12f568b61e70d5c27363c6.png" /></p>
<h2><a id="2__6"></a>2 现场保护指令</h2>
<h3><a id="21_push__pop_7"></a>2.1 push 与 pop</h3>
<p>push:入栈。<br />
pop:出栈<br />
<img src="https://static.couragesteak.com/article/e3c7676628c6259259882648048091b2.png" alt="a72ec38f3910344aa9bc72eed22a23ab.png" /></p>
<h3><a id="22_pushad__popad_12"></a>2.2 pushad 与 popad</h3>
<p>定义:对寄存器的现场保护</p>
<p>pushad相当于如下8条指令:</p>
<pre><code class="lang-">push eax
push ecx
push edx
push ebx
push esp
push ebp
push esi
push edi 最顶指向
</code></pre>
<p>popad作用则相反</p>
<h3><a id="23_pushfd__popfd_28"></a>2.3 pushfd 与 popfd</h3>
<p>定义:是对标志位进行的现场保护</p>
<p><img src="https://static.couragesteak.com/article/fac893080f885ea4393cc4a3e2af0329.png" alt="b42cd83f9e8afe32f9dec4e359b94032.png" /></p>
<h2><a id="3__33"></a>3 内存操作</h2>
<h3><a id="31_mov_34"></a>3.1 mov指令</h3>
<p>定义:对操作数进行赋值,操作数可以是寄存器、数值、间接寻址的内存数据。</p>
<pre><code class="lang-">mov eax,0x1
mov dword [44907D],1
mov al,dh
mov byte [449086],0xff
</code></pre>
<h3><a id="32_movsx__movzx_44"></a>3.2 movsx 与 movzx</h3>
<ul>
<li>movsx:带符号扩展,并传送</li>
<li>movzx:无符号扩展,并传送</li>
</ul>
<pre><code class="lang-">movsx eax,cx
movzx eax,cx
# 8位扩展到32位
movzx eax,ax
</code></pre>
<p><img src="https://static.couragesteak.com/article/4566ab29de08abe51ef8e02aac93fb07.png" alt="f090a54305113c443a8aacbce3b2f3c0.png" /><br />
<img src="https://static.couragesteak.com/article/f04ee08e71c7a7416811447657be77e4.png" alt="178f8252b7a646078213a04237a6ed9e.png" /></p>
<h2><a id="4_lea__61"></a>4 lea 指令</h2>
<p>定义:去内存地址(非数据)<br />
(需继续研究)<br />
<img src="https://static.couragesteak.com/article/c38051d21bad25a58cddbd0f6bcf849f.png" alt="88d56091f6027cc92ee51bd1434ff386.png" /></p>
<h2><a id="5_xchg__66"></a>5 xchg 指令</h2>
<p>定义:交换指令</p>
<p>与内存交换</p>
<pre><code class="lang-">xchg eax, [449080]
</code></pre>
<p>与寄存器交换</p>
<pre><code class="lang-">mov eax,0x1
mov ecx,0x2
xchg eax,ecx
</code></pre>
<p><img src="https://static.couragesteak.com/article/16985045aa36b3a7bd4791c760acee43.png" alt="1bec037a1ab749f3486edb172ca9ba7a.png" /></p>
<h2><a id="6__82"></a>6 算数运算指令</h2>
<h3><a id="61_add_sub_83"></a>6.1 add 与sub指令</h3>
<p><code>add</code>:加法指令,2个操作数相加,结果返回给第1个操作数。</p>
<pre><code class="lang-">mov eax,0x5
mov ecx,0x7
add eax,ecx
# 低8位+1
add al,0x1
还可以和地址相加,但是这里测试未通过
mov eax,0x1
add eax, [40190]
</code></pre>
<p><img src="https://static.couragesteak.com/article/52ec967ac7e6e812badd9c8202162800.png" alt="b1ad68709f401398378383892ec36b2d.png" /></p>
<p><code>sub</code>:减法指令,2个操作数相减,结果返回给第1个操作数。</p>
<pre><code class="lang-">mov eax,0x9
mov ecx,0x6
sub eax,ecx
sub ax,0x1
</code></pre>
<p><img src="https://static.couragesteak.com/article/ab8c580db564bc46ad8f31100c3026e7.png" alt="3bd5bc6ba7f278543b99f57dbe4fafc1.png" /></p>
<h3><a id="62_adc__sbb__109"></a>6.2 adc 与 sbb 指令</h3>
<p><code>adc</code>:与add不同的是,它需要额外加上cf进位标志位寄存器的值。</p>
<p>令 cf=1</p>
<pre><code class="lang-">mov eax,0x3
mov ecx,0x2
adc eax,ecx
结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1
</code></pre>
<p><img src="https://static.couragesteak.com/article/3149f0f865a7b48e51c38d4a7ab555a9.png" alt="6b4c41ba91fb7f102dce978abcd29aae.png" /></p>
<p><code>sbb</code>:与sub不同的是,它需要额外减去cf进位标志寄存器的值。<br />
令 cf=1</p>
<pre><code class="lang-">mov eax,0x3
mov ecx,0x2
sbb eax,ecx
结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1
</code></pre>
<p><img src="https://static.couragesteak.com/article/7017db69837272658246badfeb878ede.png" alt="f449220b803a57826e41f4af8e5eebc9.png" /></p>
<h3><a id="63_inc__dec__139"></a>6.3 inc 与 dec 指令</h3>
<p><code>inc</code>:该指类似于 C语言中的 i++或者i=i+1。</p>
<pre><code class="lang-">mov eax,0x2
inc eax
</code></pre>
<p><img src="https://static.couragesteak.com/article/66047c3574e2c49db082dbb295fad2c5.png" alt="c0e1063f7e7a90441e15c95545479a45.png" /></p>
<p><code>deg</code>:递减</p>
<p><img src="https://static.couragesteak.com/article/ea04cdb918766847c49ceae67eabaaa7.png" alt="d084498fb08fe6b0b37ed80eccf19c71.png" /></p>
<h3><a id="64_cdqmul__div__153"></a>6.4 cdq、mul 与 div 指令</h3>
<p><code>cdq</code>:扩展,它是将eax扩展成 edx:eax</p>
<p><code>mul</code>:乘法指令,对操作数进行乘法运算,结果放在eax,如果溢出则扩展存放到edx。</p>
<pre><code class="lang-">mov eax,0x2
mov ecx,0x3
mul ecx
</code></pre>
<p><img src="https://static.couragesteak.com/article/37c5f52257c7c135ebac3146b9b96fad.png" alt="57a662c601f2910dcc65135ffc9e8d60.png" /><br />
<img src="https://static.couragesteak.com/article/c896187a6788e458192c211490a44161.png" alt="a9653c12a1176e2cbed1c61f55007e92.png" /></p>
<pre><code class="lang-">mov eax,0x5
mov ecx,0x3
cdq
div ecx
</code></pre>
<p><code>div</code>:除法指令,对操作数进行除法运算,根据多少位的寄存器而不同存放的商和余数的位置也不同。</p>
<p><img src="https://static.couragesteak.com/article/81d3a91859b3c892f9a0cb157b145813.png" alt="54cef4a808802ee3e6dd7df2609e4de3.png" /></p>
<p>cl 低8位做除数,商在al存储,余数在ah存储。</p>
<pre><code class="lang-">mov eax,0x5
mov ecx,0x3
cdq
div cl
</code></pre>
<p><img src="https://static.couragesteak.com/article/30b16b272abf1643f67667acdd5865e7.png" alt="6bddd11b328a2cd820f0612a81c8245b.png" /></p>
<h3><a id="65_imul__idiv__186"></a>6.5 imul 与 idiv 指令</h3>
<p><code>imul</code>:也是乘法指令,却别在它有多个操作数,并且溢出直接舍去溢出的值。<br />
操作数位3个的时候,第一个寄存器作为存储结果使用。</p>
<p><img src="https://static.couragesteak.com/article/0efc12f77d37944382a5feb6f5347cfa.png" alt="a530faf805c8fa2b54c9e2e8dee4e618.png" /></p>
<p><code>idiv</code>:跟imul一样,有多个操作数,丢弃溢出。</p>
<h3><a id="66_xadd__neg__194"></a>6.6 xadd 与 neg 指令</h3>
<p><code>xadd</code>:互换并相加指令,结果返回第1个操作数。</p>
<pre><code class="lang-">mov eax,0x2
mov ecx,0x3
xadd eax,ecx
</code></pre>
<p><code>xadd eax,ecx</code>相当于</p>
<pre><code class="lang-">xchg eax,ecx
add eax,ecx
</code></pre>
<p><img src="https://static.couragesteak.com/article/fdcd226e8fb713d60d721a448594a0ea.png" alt="2a5d0783a920138ea44e34b79c4e0cbd.png" /></p>
<p><code>neg</code>:指令取反指令。</p>
<pre><code class="lang-">mov eax, 6
neg eax
</code></pre>
<h2><a id="7__217"></a>7 位运算指令</h2>
<h3><a id="71_and__218"></a>7.1 and 与</h3>
<p><code>and</code>为逻辑 与 运算,通过位运算得出结果。</p>
<ul>
<li>相同为1,不同为0(都为0则不变)</li>
</ul>
<pre><code class="lang-">3 0011
5 0101
0001
mov eax,0x3
mov ecx,0x5
and eax,ecx
</code></pre>
<p><img src="https://static.couragesteak.com/article/5a1f88e7a47f708efa31eeaf3c6864c4.png" alt="531281ecbdcc505aeded032a2dd67518.png" /></p>
<h3><a id="72_or__235"></a>7.2 or 或</h3>
<p><code>or</code>:逻辑 或 运算,通过位运算得出结果。</p>
<p>只要有1,则为1;2个都为0则为0</p>
<pre><code class="lang-">3 0011
5 0101
---------
7 0111
mov eax,0x3
mov ecx,0x5
or eax,ecx
</code></pre>
<p><img src="https://static.couragesteak.com/article/cbc32c512e6e84bf5450f618dd373528.png" alt="3407901f448358b377a1d17f7113a1b7.png" /></p>
<h3><a id="73_xor__253"></a>7.3 xor 异或</h3>
<p><code>xor</code>:逻辑异或运算,通过位运算得出结果。</p>
<ul>
<li>相同为0,不同为1。</li>
</ul>
<pre><code class="lang-">3 0011
5 0101
---------
7 0110 6h
mov eax,0x3
mov ecx,0x5
xor eax,ecx
</code></pre>
<p><img src="https://static.couragesteak.com/article/9f281623713a02a0dc1c059e211046ce.png" alt="ebc1e16b004bc938e71c9eb8cd0fbf43.png" /></p>
<h3><a id="74_not__270"></a>7.4 not 取反</h3>
<p><code>not</code>:逻辑取反运算,通过位运算得出结果。</p>
<ul>
<li>1则为0, 0则为1</li>
</ul>
<pre><code class="lang-">3 0000 0000 0000 0000 0000 0000 0000 0011
---------
7 11111111111111111111111111111100
mov eax,0x3
not eax
</code></pre>
<h2><a id="8__282"></a>8 比较指令</h2>
<h3><a id="81_cmp__283"></a>8.1 cmp 比较</h3>
<p><code>cmp</code>:比较指令,2个操作数,通常是比较2个值是否相等,影响标志位寄存器。</p>
<ul>
<li>结果为truw,zf(零标志位)为1,不同为0</li>
</ul>
<p>与sub指令不同的是,cmp指令不存储结果。</p>
<pre><code class="lang-">mov eax, 0x1
mov ecx, 0x2
cmp eax,ecx
</code></pre>
<h3><a id="82_test__295"></a>8.2 test 逻辑比较</h3>
<p><code>test</code>:比较指令,2个操作数,类似于逻辑与运算,但是结果不进行赋值,而是影响标志位寄存器,达到跳转指令的目的。</p>
<pre><code class="lang-">mov eax,0x0
test eax,eax zf 为1
je 44908f 跳转
mov eax,0x2
test eax,eax zf 为0
je 44908f 不跳转
</code></pre>
<h2><a id="9__308"></a>9 跳转类指令</h2>
<h3><a id="91_jmp__309"></a>9.1 jmp 无条件跳转</h3>
<p><code>jmp</code>:无条件跳转,不根据标志位来改变程序逻辑。</p>
<pre><code class="lang-">jmp 00449087
</code></pre>
<p><img src="https://static.couragesteak.com/article/b5e0f155c366c567ee391d4de20c0e8f.png" alt="8b4d3c54ee6ea90cc5ad8cb655e20361.png" /></p>
<h3><a id="92_je__jz__317"></a>9.2 je 与 jz 相等跳转</h3>
<p>定义:je与jz根据 zf 标志位来进行跳转,</p>
<ul>
<li>zf=1:跳转</li>
<li>zf=0:不跳转</li>
</ul>
<p>注释:je与jz相同</p>
<pre><code class="lang-">mov eax,0x1
mov ecx,0x2
cmp eax,eax
je short 0044908F
</code></pre>
<p><img src="https://static.couragesteak.com/article/d8188092ee7cbb7c60ca352a8c3570bf.png" alt="5002cc5210e103015adf3edb21291ea5.png" /></p>
<h3><a id="93_jne__jnz__334"></a>9.3 jne 与 jnz 不相等跳转</h3>
<p>定义:jne 与 jnz 根据 zf 标志位来进行跳转</p>
<ul>
<li>zf=0,不相等 跳转</li>
<li>zf=1,相等 不跳转</li>
</ul>
<pre><code class="lang-">mov eax,0x1
cmp eax,eax
jne short 0044908F
</code></pre>
<p>补充</p>
<pre><code class="lang-">jnz与je写到一起相当于无条件跳转jmp
mov eax,0x1
cmp eax,eax
jne 0044908F
je 0044908F
</code></pre>
<h3><a id="94_js___355"></a>9.4 js 负数 跳转</h3>
<p>定义:js如果结果为负数时,sf置1</p>
<ul>
<li>sf=1 负数 跳转</li>
<li>sf=0 正数 不跳转</li>
</ul>
<pre><code class="lang-">mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2=-1
js 44908F 跳转
</code></pre>
<p><img src="https://static.couragesteak.com/article/b59b9c07637aaa5e444317be76f32749.png" alt="15e268beec4055c0e5d637ef42731f78.png" /></p>
<h3><a id="95_jns___369"></a>9.5 jns 正数 跳转</h3>
<p>定义:如果比较结果为正数,SF置0</p>
<ul>
<li>sf=0 正数 跳转</li>
<li>sf=1 非正数 不跳转</li>
</ul>
<h3><a id="96_jpjpe___376"></a>9.6 jp[jpe] 偶 跳转</h3>
<p>定义:如果比较结果(二进制1的个数)为偶数时,PF置1</p>
<ul>
<li>PF=1 偶数 跳转</li>
<li>PF=0 奇数 不跳转</li>
</ul>
<pre><code class="lang-">mov eax,0x4
mov ecx,0x1
cmp eax,ecx 4-1=(3)d=(0011)o
jp 44908F 1为偶数个,跳转
</code></pre>
<h3><a id="97_jnpjpo___389"></a>9.7 jnp[jpo] 奇 跳转</h3>
<p>定义:如果比较结果(二进制1的个数)为奇数时,PF置0</p>
<ul>
<li>PF=0 奇数 跳转</li>
<li>PF=1 偶数 不跳转</li>
</ul>
<h3><a id="98_jo__395"></a>9.8 jo 溢出跳转</h3>
<p>定义:jo为溢出标志位跳转指令</p>
<ul>
<li>OF=1 溢出 跳转</li>
<li>OF=0 不跳转</li>
</ul>
<p>以32位举例如下:<br />
最大正数:7FFFFFFF~2147483647(有符号)</p>
<pre><code class="lang-">mov eax,0x7FFFFFFF
add eax,0x1
jo 0044908F
</code></pre>
<p><img src="https://static.couragesteak.com/article/b8862cf166ae0d15f36b54e1173ea77c.png" alt="ba6f5da5e569f12b91308458a70db39f.png" /></p>
<h3><a id="99_jb___412"></a>9.9 jb 无符号 产生进位跳转</h3>
<p>定义:比较后,如果第一个操作数 < 第2个操作数,CF置1</p>
<ul>
<li>CF=1 跳转</li>
<li>CF=0 不跳转</li>
</ul>
<pre><code class="lang-">mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2,产生借位,CF=1
jb 00449091 跳转
</code></pre>
<p><img src="https://static.couragesteak.com/article/7a6f6a9d3d4ccea57f76c0981b995db2.png" alt="6604028412c8f32421dd4c63f1548dce.png" /></p>
<h2><a id="99_jnb__426"></a>9.9 jnb 未产生进位跳转</h2>
<p>定义:2个操作数比较,第一个操作数 > 第二个操作数,CF置0</p>
<ul>
<li>CF=0 跳转</li>
<li>CF=1 不跳转</li>
</ul>
<pre><code class="lang-">mov eax,0x2
mov ecx,0x1
cmp eax,ecx 未产生借位,CF=0
jb 00449091 不跳转
</code></pre>
<h3><a id="99_jbe_CZ_438"></a>9.9 jbe C和Z标志位跳转</h3>
<p>定义:操作数1 < 操作数2 的时候,</p>
<ul>
<li>CF=1或ZF=1,跳转</li>
<li>反之,不跳转</li>
</ul>
<p>CF:进位标志位(产生进位/错位时,CF=1)<br />
ZF:零标志位(运算结果为0时,ZF=1)</p>
<h3><a id="99_jnbeja_CZ_448"></a>9.9 jnbe[ja] C和Z标志位跳转</h3>
<p>定义:操作数1 > 操作数2 的时候</p>
<ul>
<li>CF=0且ZF=0,跳转</li>
<li>只要有1,则不跳</li>
</ul>
<h3><a id="910_jl__S_454"></a>9.10 jl 有符号 S标志位跳转</h3>
<p>jl与jb类似的是 比较 操作数1 < 操作数2 的跳转,但主要根据SF(符号)标志位跳转。</p>
<ul>
<li>SF=1,负数 跳转</li>
<li>SF=0,不跳转</li>
</ul>
<pre><code class="lang-">mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2<0 则 SF=1
jl 499091 实现跳转
</code></pre>
<h2><a id="10_call_467"></a>10 函数call指令</h2>
<p>类似于jmp指令,但它主要用于调用一个子程序或函数。</p>
<pre><code class="lang-">call 地址
retn
</code></pre>
<h2><a id="11__475"></a>11 循环类指令</h2>
<h3><a id="111__476"></a>11.1 跳转实现</h3>
<pre><code class="lang-">xor eax,eax
mov ecx,0x5
dec ecx
test ecx,ecx
jnz 00449087
</code></pre>
<p><img src="https://static.couragesteak.com/article/3104010578381efe3bfd86473b62a073.png" alt="ebb8c49c3919e37c1c1da95d95a3dce5.png" /></p>
<h3><a id="112_loop_487"></a>11.2 loop指令</h3>
<p>定义:根据寄存器 ECX值,递减直到为1时,不在继续循环。</p>
<pre><code class="lang-">xor edx,edx
mov ecx,0x5
inc edx
nop
nop
loopd 00449097
</code></pre>
<p>loopd:32位<br />
loopw:16位</p>
<p><img src="https://static.couragesteak.com/article/5caf7e33363fb538cd7bcfb4f5698c0e.png" alt="85b9ff318d53112b0cc7f30685686232.png" /></p>
<h2><a id="12__503"></a>12 寻址方式</h2>
<h3><a id="121__504"></a>12.1 直接寻址</h3>
<p>根据直接看到的指令干的什么,就是直接寻址</p>
<pre><code class="lang-">push 0x123456
mov eax,0x2
inc eax
dec ebx
mov ecx,0x3
add eax,0x5
push eax
</code></pre>
<h3><a id="122__516"></a>12.2 间接寻址</h3>
<p>肉眼看的话,不知道结果,通过CPU运行到此处,才能得出结果</p>
<p><img src="https://static.couragesteak.com/article/c489ed2a1a4c56ad335fbcf5ec42370e.png" alt="93373f1629966a6d7c13a6b4bceceb9a.png" /></p>
<p>参考地址:<br />
https://www.bilibili.com/video/BV135411u7HR</p>
留言