【问题标题】:need help in finding out what this program do-(assembler)需要帮助找出该程序的作用-(汇编程序)
【发布时间】:2014-04-15 10:50:41
【问题描述】:

我是汇编程序的新手,我需要帮助来了解程序的作用:

  MOV SI, 0x0210
  MOV BX, 0x0220
  MOV CX, 0x5
L1: MOV AL, [SI]
  NOT AL
  INC AL
  MOV [BX], AL
  INC BX
  INC SI
  LOOP L1
  HLT

谁能告诉我地址​​开头的“0x..”是什么?

(所有编号均为十六进制)。

非常感谢!!

【问题讨论】:

  • 嗯,它做的一件事就是汇编...0x 引入了一个以十六进制表示的数字常量(即基数 16)。它看起来像是在尝试对字节序列进行 2s 补码...
  • @twalberg:它确实与 nasm 组装在一起。
  • @Michael 原版在 Jester 编辑之前没有...

标签: assembly x86 reverse-engineering


【解决方案1】:

MOV SI, 0x0210 链接到 SI 中的地址

MOV BX, 0x0220 链接到 BX 中的地址

MOV CX, 0x5 将 5 放入 CX

L1: MOV AL, [SI] (L1 也假设为跳跃标签) [SI] 指向 x210 处的值

NOT AL If AL =/= 0 退出循环

INC AL 如果 AL 为 0,则设为 1

MOV [BX], AL 将 1 或 AL 的值放入 x220

INC BX 更改指向下一个字符串的指针(假设它们是字节)

INC SI ^ 相同

LOOP L1 回到 L1

HLT ...

【讨论】:

  • NOT AL ; If AL =/= 0 exit loop
  • @RobertPounder HLT != NOT... NOT 对其参数进行按位补码(在这种情况下为AL)。此外,INC AL 不是有条件的。它只是增加AL,不管它是否为0……而MOV [BX], ALAL 的值存储到BX 中保存的地址中,而不是“1 或AL 的值”。 .
【解决方案2】:

正如您自己所指出的,数字文字以十六进制为基数。 0x 是一个常见的前缀,表示应将数字解释为十六进制。一些汇编器使用 suffix h 代替(如在1234h 中),而有些则支持这两种变体。

LOOP 指令将CX 减 1,如果 CX != 0 则跳转到给定地址。所以这个程序中的循环将运行 5 次。

在每次迭代期间,从地址0x210 开始的一块内存中加载一个字节。然后取反此值 ((~x)+1 == -x),并将结果存储在地址为 0x220 的内存块中。源地址和目标地址都递增,以便它们在循环的下一次迭代中指向各自数组中的下一个字节。

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多