【问题标题】:How do I see a value on register?如何查看寄存器中的值?
【发布时间】:2013-03-23 15:04:05
【问题描述】:

我读过汇编语言方面的书籍,其中有一章是关于指令的。我了解指令 mov 正在做什么,但我不明白如何检查并查看结果。我写了一个hello world。

.global _start
.data
some_var:
    .long 0x000721
.text
_start:
mov  $1, %rax         # system call 1 is write
mov  $1, %rdi         # file handle 1 is stdout
#  mov  $message, %rsi  # address of string to output
mov $0x1, %rsi
mov  $2, %rdx # number of bytes
syscall               # invoke operating system to do the write
                    # exit(0)
mov  $60, %rax        # system call 60 is exit
xor  %rdi, %rdi       # we want return code 0
syscall               # invoke operating system to exit
message:
.ascii  "Hello, Universe)\n"

但是为什么它不起作用。如何查看内存和寄存器中的值?

操作系统:Linux(debian)。英特尔 64 位

【问题讨论】:

  • 这不是它的答案或改进,只是一个评论。我建议您学习使用调试器工具。即使使用printf() 实现,在某些情况下也可能很难(比如说,不可行)看到值。看看gdb。对于一些类 UNIX 系统来说是一个非常好的工具。
  • 谢谢。这是非常好的评论!

标签: assembly x86-64 gnu-assembler


【解决方案1】:

您需要rsi 中的地址,而不是值。 这就是为什么它适用于

mov  $message, %rsi

但不是

mov $0x1, %rsi

如果要打印数字,首先需要一个例程将数字转换为ASCII字符串(基本上你需要写一个printf的简单版本)。

【讨论】:

  • 如果你想打印一个数字,这很容易。一个 ASCII 到整数的例程是微不足道的。但是 printf 的实现需要一些时间..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多