彙編總結:mov指令

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字節

練習題

  1. 在c語言裏char c 賦值給short s 該用上面的什麼指令?

  2. 在c語言裏char c 賦值給unsigned short s 該用上面的什麼指令?

  3. 在c語言裏unsigned char c 賦值給short s 該用上面的什麼指令?

  4. 在c語言裏short s 賦值給char c該用上面的什麼指令?

  5. 在c語言裏unsigned short s 賦值給char c該用上面的什麼指令?

  6. 在c語言裏unsigned short us 賦值給short s該用上面的什麼指令?

    友情指示上面的問題想知道結果能夠先寫好c語言代碼,再gcc -S 生成彙編文件查看

相關文章
相關標籤/搜索