《深入理解計算機系統》 練習題3.2-3.3
阿新 • • 發佈:2018-12-21
彙編命令總結
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) |