我是靠谱客的博主 称心鸭子,最近开发中收集的这篇文章主要介绍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


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

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:

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,可以使用如下指令:
 

test al, 00001001b;	测试位0和位3

本例中的00001001称为位掩码。

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

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汇编指令学习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部