2013-03-23 270 views
2

我读过关于汇编语言的书籍,关于指令的一章。我明白mov指令在做什么,但我不明白如何检查并看到结果。我写了一个你好的世界。如何查看寄存器上的值?

.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" 

但为什么它不起作用。我如何看到内存和注册的价值?

os:linux(debian)。英特尔64位

+1

这不是它的答案或改进,只是一个评论。我建议你学会使用调试工具。即使使用'printf()'实现可能在某些情况下很难(例如不可靠)查看值。看看'gdb'。对于一些类UNIX系统来说,它是一个非常好的工具。 – Jack 2013-03-23 16:58:46

+0

谢谢。这是非常好的评论! – volkov 2013-03-23 20:37:31

回答

1

您需要一个地址rsi,而不是一个值。 这就是为什么它的工作原理与

mov $message, %rsi 

但与

mov $0x1, %rsi 

如果要打印的数字,你需要一个程序来数先转换成ASCII字符串(基本上你需要编写一个简单的版本printf)。

+0

或只是调用'printf' ... – 2013-03-23 15:16:37

+1

如果你想打印一个数字,这很容易。一个ASCII到整数的例程是微不足道的。但是'printf'的执行需要一些时间。 – Jack 2013-03-23 17:01:29