2013-03-23 79 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