我是靠谱客的博主 称心鸭子,这篇文章主要介绍x86汇编指令学习,现在分享给大家,希望可以做个参考。

ltr

  1. 使用方法: ltr %ax
  2. 意义:将寄存器ax中的值加载到任务寄存器 TR 中

jnz 和 jne

  1. jnz (or jne)是指令测试之后的条件跳转。
  2. jnz:如果Zero flag(ZF)被清零,它将跳转到指定位置。
  3. jnz 通常用于显示测试不等于0,而jne 通常跟在cmp指令之后。

Example1

复制代码
1
2
3
4
5
call ds:InternetReadFile  ; call function InternetReadFile mov [ebp+var_4], eax  ; eax stores the result of the function cmp [ebp+var_4], 0  ; test if function return is 0 jnz short loc_4010ES  ; if function InternetReadFIle does not return 0,jump to loc_4010ES

Example2

Following C code

复制代码
1
2
3
4
5
6
7
int x = 1; int y = 2; if(x == y) { printf("x equals y. n"); } else { printf("x is not equals y. n"); }

Can be disassembled as follows:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
00401006 mov [ebp+var_4], 1 0040100D mov [ebp+var_8], 2 00401014 mov eax, [ebp+var_4] 00401017 cmp eax, [ebp+var_8]  ; if x=y, the cmp will set the ZF to 1 0040101A jnz short loc_40102B  ; jump if ZF not set (if x!=y) 0040101C push offset aXEqualsY_  ; "x equals y.n" 00401021 call printf 00401026 add esp, 4 00401029 jmp short loc_401038 0040102B loc_40102B: 0040102B push offset aXIsNotEqualToY  ; "x is not equal to y.n" 00401030 call printf

.section.altinstr_replacement,  "ax",  @progbits

  1. ax 表示权限, ax是allocation execute 的编写,表示该节区域是可分配并且可执行的
  2. progbits 是type。

test指令:对两个操作数进行逻辑(按位)与操作

        test 指令在两个操作数的对应位之间进行AND操作,并且根据运算结果设置符号标志位,零标志位和奇偶标志位。

        test指令和AND指令唯一不同的地方是,test指令不修改目标操作数。

例如:

        test指令能够同时检查几个位,假如要想知道AL寄存器的位0和位1是否置1,可以使用如下指令:
 

复制代码
1
test al, 00001001b; 测试位0和位3

本例中的00001001称为位掩码。

从下面例子中,可以推断出只有当所有测试都清0时,零标志位才置1;

复制代码
1
2
3
4
5
6
7
0 0 1 0 0 1 0 1 <-输入值 0 0 0 0 1 0 0 1 <-测试值 0 0 0 0 0 0 0 1 <-结果;ZF=0 0 0 1 0 0 1 0 0 <-输入值 0 0 0 0 1 0 0 1 <-测试值 0 0 0 0 0 0 0 0 <-结果; ZF=1

标志位

test指令总是清除溢出和进位标志位,修改其符号标志位,零标志位和奇偶标志位的方法和AND指令相同。

push指令

  • push %eax
    • 将eax数值压入栈中,可分解为:
  • subl $4, %esp.        --------------->. esp  = esp - 4
  • movl %eax, (%esp) ---------------> *(int32_t*)esp = eax

pop 指令

  • pop %eax
    • 将eax数值压入栈中,可分解为:
  • movl (%esp), %eax -------------> eax = *(int32_t*)esp
  • addl $4, %esp.        -------------> esp = esp + 4

call 指令

  • call 0x12345
    • 调用0x12345 这个地址,可分解为:
  • pushl %eip.           --------------> 将cpu下一条要执行的指令压入栈中
  • movl %0x12345,%eip ---------> eip = 0x12345
    • 注意:CPU下一条指令将会从0x12345中取

ret 指令

  • ret
    • 返回call之前的地址,可分解为:
  • pop %eip            --------------> 将call压入栈的指令弹出付给eip

最后

以上就是称心鸭子最近收集整理的关于x86汇编指令学习的全部内容,更多相关x86汇编指令学习内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部