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
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值