html tool

2019年1月20日星期日

关于:push dword ptr ...


push dword ptr ds:[ebx+0x34]
  • x ptr 介绍
    • https://blog.csdn.net/GaryZhang29/article/details/2439504

      8.5 指令要处理的数据有多长?
      8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。对于这个问题,汇编语言中用一下方法处理。
      (1)通过寄存器名指明要处理的数据的尺寸。
      例如:
      下面的指令中,寄存器指明了指令进行的是字操作是字操作:
      mov ax,1
      mov bx,ds:[0]
      mov ds,ax
      mov ds:[0],ax
      inc ax
      add ax,1000

      下面的指令中,寄存器指明了指令进行的是字节操作
      mov al,1
      mov al,bl
      mov al,ds:[0]
      mov ds:[0],al
      inc al
      add al,100
      (2)在没有寄存器名存在的情况下,用操作符 X ptr 指明内存单元的长度,X在汇编指令中可以为word或byte
      例如:
      下面的指令中,用word ptr 指明了指令访问的内存单元是一个字单元:
      mov word ptr ds:[0],1
      inc word ptr [bx]
      inc word ptr ds:[0]
      add word ptr [bx],2
      下面的指令中,用byte ptr 指明了指令访问的内存单元是一个字单元:
      mov byte ptr ds:[0],1
      inc byte ptr [bx]
      inc byte ptr ds:[0]
      add byte ptr [bx],2
        在没有寄存器参与的内存单元访问指令中,用word prt 或byte ptr 显性地指明所要访问的内存单元的长度是很必要的。否则,CPU无法得知所要访问的单元,还是字节单元。
      假如我们用Debug查看内存的结果如下:
      2000:1000 FF FF FF FF FF FF ......
      那么指令:
      mov ax,2000H
      mov ds,ax
      mov byte ptr [1000H],1
      将使内存中的内容变为:
      2000: 1000 01 FF FF FF FF FF ......
      而指令:
      mov ax,2000H
      mov ds,ax
      mov word ptr [1000H],1
      将使内存中的内容变为:
      2000:1000 01 00 FF FF FF FF ......
        这是因为 mov byte ptr [1000H],1访问的是地址为 ds:1000H 的字节单元,修改的是ds:1000H 单元的内容;而mov word ptr [1000H],1 访问的是地址为 ds:1000H 的字单元,修改的是 ds:1000H 和 ds:1001H 两个单元的内容。

      (3) 其他方法
        有些指令默认了访问的是字单元还是字节单元,比如:push [1000H] 就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作。
      【popexizhi: 这里的新问题那 push dword ptr ds:[eax + 0x34] 的dword又有什么用呢?】

  • push dword ptr ...
    • https://stackoverflow.com/questions/21595357/what-does-push-dword-ptr-eax22-mean

      The push instruction, much like many other x86 instructions, can take a variety of operands: immediate values, registers, and memory addresses:
      push 10                 ; pushes the value 10 (32 bits in 32-bit mode)
      push eax                ; pushes the contents of the 32-bit register eax
      push DWORD [ebx + 42]   ; pushes 32 bits from the memory location ebx + 42
      The register form infers the size from the size of the register. The memory form needs to have the size specified (e.g. here shown in Intel syntax). For immediate values, the operand size is either 16 or 32 bits; the current mode is default, and the other size can be explicitly selected (e.g. push WORD 10 in 32-bit mode).

      [popexizhi: ok,这里很完美的回答了上面的问题,push dword ptr ds:[ebx+0x30] 解释为将ds:[ebx + 0x30] 中所指向的32的内存地址push了]

没有评论:

发表评论