算數運算指令
指令系統是組合語言學習的基礎,上次介紹了運算元定址指令,這次以x86彙編為基礎繼續總結資料運算類指令
(1) mov 指令
格式: mov 目標 源
舉幾個例子:
mov ax 5 ;把立即數傳送給暫存器ax
mov ax bx ; 把bx中的值傳送給ax
mov [ebx] eax ;把暫存器eax中的內容傳遞給ebx中位址所指向的記憶體單元
需要注意的是
立即數不能作為目標位址
目標暫存器不能是**段暫存器cs
兩個記憶體單元之間不能直接傳遞資料
兩個段暫存器之間不能直接傳遞資料
將立即數傳遞給記憶體單元時,必須說明立即數的型別,如:
mov dword ptr [eax]
12
中 dword ptr 說明了eax指向的記憶體單元是乙個雙字,所以立即數會被彙編成乙個32位的二進位制數放在記憶體中。
(2)交換指令 xchg
格式為
xchg 運算元1 運算元2
交換功能其實是可以用mov實現的,但是既然系統提供了這條指令,那何樂而不用之呢?即方便了程式設計,還提高了執行效率。
還是需要注意的是兩個運算元不能同時再記憶體單元裡。
(3)堆疊指令 push 和pop
格式為
push src :將src壓棧
pop dst:將棧頂元素彈出到dst
(dst可以是暫存器或記憶體單元)
(1)
in :把埠的資料傳送到暫存器或記憶體
out:把累加器(暫存器al、ax或eax)中的資料傳送給埠
如:
in ax 54h ;將埠54h的字資料傳送給ax
out 54h al ;將al中的位元組資料傳遞給埠54h
lea si src ;將src的位址傳遞給si
(1)位元組擴充套件成字指令 cbw(convert byte to word)
(2)字擴充套件成雙字指令 cwd(convert word to doubleword)
(3)雙字擴充套件成四字指令cdq(convert doubleword to quadword)
加法和減法不同於乘除法,是不去別無符號和帶符號數的
(1)add
格式:
add dst,src ;(dst)+(src)——>
(dst)
eg:add al 9
add ax [bx]
add word ptr [cx] ,1
(2)帶進製加法指令 adc
adc 在add的基礎上加上標誌位cf,格式同add
(3)加一指令 inc 減一指令 dec
類似於我們c語言裡的++和- -
格式:
inc ax ;暫存器ax中的數+
1dec dst ;運算元dst-
1
需要注意的是inc和dec並不影響標誌位cf
(1)sub 除了實行減法外,同add
(2)sbb 帶借位減法,需要減去cf,格式同adc
(1)無符號乘法
格式:mul src
其中src作為原運算元,可以是暫存器或記憶體中的數,但不可以是立即數。另乙個乘數在累加器中,乘積也儲存在累加器中。
示例:
mov al 3
mov bl 2
mul bl ;計算3
*2
注意:如果乘積溢位,會對cf和of置1,否則置0。
(2)帶符號乘法
格式:(1)div
格式:div src src作為除數,被除數放在累加器裡。商放在累加器的低位,餘數放在累加器的高位。
示例:
mov al 8
mov bl 4
div bl ;8
/4 商放在al中,餘數放在ah中。
(2)idiv
帶符號除法,格式同div
[1]李元章等. 組合語言與接**術 北京:北京理工大學出版社,2018.
組合語言 16指令系統總結
8086cpu 提供以下幾大類指令。資料傳送指令 mov push pop pushf popf xchg等都是資料傳送指令,這些指令實現暫存器和記憶體 暫存器和暫存器之間的單個資料傳送。算術運算指令 add sub adc sbb inc dec cmp imul idiv aaa等都是算術運算指...
(2)組合語言之資料傳送指令
c語言有不同的資料格式,如char,short,int,long等。組合語言針對不同資料有不同的操作碼形式,如movb 傳送位元組 movw 傳送字 movl 傳送雙字 本篇及後面幾篇文章皆採用32位的intel格式,如下圖所示 intel資料型別 彙編 字尾 大小 位元組 位元組b 1字w2 雙字...
組合語言之轉移指令
轉移指令 可以修改ip或同時修改cs和ip的指令統稱為轉移指令。短轉移ip的修改範圍 128 127 近轉移ip的修改範圍 32768 32767 1.操作符offset 例 assume cs codesg codesg segment start mov ax,offset start 相當於 ...