1. 程式人生 > >《深入理解計算機系統》 練習題3.2-3.3

《深入理解計算機系統》 練習題3.2-3.3

彙編命令總結

1)%eax,%dx就是暫存器的名字 2)(%rax)。只要是有括號的了,那就是記憶體引用。注意x86-64中的記憶體引用總是用四字長暫存器給出的,即暫存器名字開頭都是r開頭的。(%rax)意思是取暫存器%rax中的存的地址中的存的值,相當於解引用兩次,先解引用暫存器,再解引用這地址(我用“解引用”這個詞只是為了方便理解)。 3)mov命令中,兩個運算元只允許有一個記憶體引用,即只能有一個帶括號的。 4)關於mov命令的字尾,肯定與記憶體引用中的暫存器的長度無關,而是與另一個暫存器的長度有關 5)b代表1個位元組;w代表1個字,2個位元組;l代表2個字,4個位元組;q代表4個字,8個位元組。

3.2

補充以下mov命令的字尾:

原命令 講解
mov %eax, (%rsp) %eax是2個字的,所以應該是movl
mov (%rax), %dx %dx是1個字的,所以應該是movw
mov $0xFF, %bl %bl是1個位元組的,所以應該是movb
mov (%rsp,%rdx,4), %dl %dl是1個位元組的,所以應該是movb
mov (%rdx), %rax %rax是4個字的,所以應該是movq
mov %dx, (%rax) %dx是1個字的,所以應該是movww

3.3

下面的每行彙編命令都是錯的,講出原因

原命令 講解
movb $0xF, (%ebx) 記憶體引用的暫存器必須是四個字的,改成movb $0xF, (%rbx)
movl %rax, (%rsp) %rax是四個字而l代表兩個字,改成movl %eax, (%rsp) 或者 movq %rax, (%rsp)
movw (%rax), 4(%rsp) 兩個運算元不能都是記憶體引用
movb %al, %sl 沒有暫存器名字叫%sl
movq %rax,$0x123 dest不能作為des運算元
movl %eax, %rdx 原答案為destination operand incorrect size,改成movl %eax, %edx
movb %si, 8(%rbp) %si是一個字而b代表一個位元組,改成movb %sil, 8(%rbp) 或者 movw %si, 8(%rbp)