mov指令的做用:spa
mov指令多是彙編裏用的最多的指令了,完成c語言裏的賦值。翻譯
mov指令種類:code
1.普通的mov指令 2.作符號擴展的movs 3.作零擴展的movz
1.普通mov的種類有:進程
movb #完成1個字節的複製 movw #完成2個字節的複製 movl #完成4個字節的複製 movq #完成8個字節的複製
2.movs的種類以及爲何要符號擴展指令?內存
1.爲何要用符號擴展指令
ci
若是要完成下面的c語言代碼it
char c = -1; int i = c;
若是翻譯成下面的彙編代碼,會發現一個問題io
用movb把%al寄存器裏的-1,複製到%ebx寄存器,結果變成了255。等等,爲何會這樣?class
.section .text .global _start fmt: .ascii "%d\n\0" _start: movb $-1, %al #把-1賦值到寄存器al xorl %ebx, %ebx #把寄存器%ebx 賦值爲0 movb %al, %bl #把al的值賦值到%ebx寄存器的低8位 (引用%ebx寄存器低8位的方法就是使用%bl寄存器) xorq %rax, %rax movl %ebx, %esi movq $fmt, %rdi call printf #調用printf 打印ebx寄存器的內容,會發現輸出變成了255 movl $0, %edi #調用exit退出進程 call exit
接上段,學過原碼,補碼,反碼的同窗知道,在二進制的角度看待一個數。其在內存中表示正數,表示負數,依賴機器是怎麼解釋最高bit位的1。c語言裏面signed類型,若是最高bit爲1,認爲它是一個負數。unsigned類型,始終認爲是正數。gcc
回到剛剛的-1變成255的問題。
做爲用戶,只想在由char 類型轉爲int,輸出仍是-1,就這麼簡單。
(事實上c語言已經作了自動轉換,這裏的char,int只是指代上面的彙編代碼裏的類型)
char類型的-1在內存中的表示:11111111
(因爲最高bit位爲1,且類型爲signed,因此解釋成-1)
使用movb指令把char類型的-1複製到int類型裏:
char類型的-1複製到int類型在內存中的表示:00000000000000000000000011111111
(因爲最高bit位爲0,且類型爲signed,因此解釋成255)
int類型的-1在內存中的表示:11111111111111111111111111111111
兩邊一對比就知道,char複製到int須要把多出來的字節做符號位擴展。
2.movs的種類
movsbw #做符號擴展的1字節複製到2字節 movsbl #做符號擴展的1字節複製到4字節 movsbq #做符號擴展的1字節複製到8字節 movswl #做符號擴展的2字節複製到4字節 movswq #做符號擴展的2字節複製到8字節 movslq #做符號擴展的4字節複製到8字節
3.movz的種類及其做用
1.若是要完成下面的c語言代碼
unsigned char c = -1; unsigned i = c; printf("%x:%d\n", i, i); //輸出 0xff, 255
這時候就是movz指令大顯身手的時候。
movb $-1, %al #%al = 0xff movzbl %al, %ebx #%ebx = 0x000000ff
2.movz指令的種類
movzbw #做0擴展的1字節複製到2字節 movzbl #做0擴展的1字節複製到4字節 movzbq #做0擴展的1字節複製到8字節 movzwl #做0擴展的2字節複製到4字節 movzwq #做0擴展的2字節複製到8字節 movzlq #做0擴展的4字節複製到8字節
練習題
在c語言裏char c 賦值給short s 該用上面的什麼指令?
在c語言裏char c 賦值給unsigned short s 該用上面的什麼指令?
在c語言裏unsigned char c 賦值給short s 該用上面的什麼指令?
在c語言裏short s 賦值給char c該用上面的什麼指令?
在c語言裏unsigned short s 賦值給char c該用上面的什麼指令?
在c語言裏unsigned short us 賦值給short s該用上面的什麼指令?
友情指示上面的問題想知道結果能夠先寫好c語言代碼,再gcc -S 生成彙編文件查看