1. 乘法指令
1.1 無符號乘法
mulmul r8/m8 ;ax
mul r16/m16 ;dx.ax
mul r32/m32 ;edx.eax
1.2 有符號乘法
imul
imul r8/m8 ;ax
imul r16/m16 ;dx.ax
imul r32/m32 ;edx.eax
從80386開始還有:
mul r32, r32/m32 ;r32
mul r32, r32/m32, imm ;r32
兩個16位數相乘,如果結果還是
16位,則
of=cf=0
,此時dx
僅僅是高位擴充套件或符號位描述,可以忽略
dx。如果結果超過
16位,則
of=cf=1
,此時dx
不僅包括高位擴充套件或符號位描述,還包括結果一部分的具體數值,不能忽略dx。
2. 除法指令
2.1 無符號數除法
div r8/m8 ;al
ah的餘數div r16/m16 ;ax
dx的餘數div r32/m32 ;eax
edx的餘數2.2 有符號數除法
idiv r8/m8 ;al
ah的餘數idiv r16/m16 ;ax
dx的餘數idiv r32/m32 ;eax
edx的餘數
當除法指令結果的商太大,用2/4位元組無法正確表達時,會產生溢位,除以
0也會溢位,如果是有符號除法,則。
符號擴充套件指令
例如計算-10/3,**如下:
mov ax,-10
cwdmov cx,3
idiv cx
由於除數是cx,所以被除數是
dx.ax
,cwd
設定dx
,否則會用之前殘留的值。
按位與and,按位或
or,按位異或
xor,按位取反
nota xor a = 0
a xor 全
1 = not a
a xor 全
0 = a
求乙個數的絕對值:abs(ax)
mov ax, a
cwd ;a是正數,
dx=0000;a
是負數,
dx=ffff
;xor ax, dx ;a是正數,
ax不變;
a是負數,
ax = ~ax
;sub ax, dx ;a是正數,結果
=ax-0;a
是負數,結果
=ax-(-1)=ax+1
,結合上步,共同執行了取反加一,即求補(求負)的操作;
三目運算:a == 2 ? 6 : 9;
mov ax, a
sub ax, 2 ;a是2,則
ax=0
,否則ax != 0
neg ax ;求補,a是
2則cf=0
,否則cf=1
sbb ax, ax ;0-cf,a是
2則ax=0
,否則ax=-1
and ax, 3 ;a是2則
ax=0
,否則ax=3
add ax, 6 ;a是2則
ax=6
,否則ax=3+6=9
ax == cx ? dx : bx
sub ax,cx
neg ax
sbb ax,ax
and (bx-dx)
add dx
設x、y、z
、v均為16
位帶符號數,分別存放在x、
y、z、
v儲存單元中,閱讀如下程式段,得出它的運算公式,並說明運算結果存於何處?
mov ax,x
imul y ;dx.ax表示
x*ymov cx,ax
mov bx,dx ;bx.cx表示
x*ymov ax,z
cwd ;dx.ax表示
zadd cx,ax
adc bx,dx ;高字+擴充套件
+cf, bx.cx
表示x*y+z
sub cx,540
sbb bx,0 ;bx.cx表示
(x*y+z)-540
mov ax,v
cwd; ;dx.ax表示
vsub ax,cx
sbb dx,bx ;dx.ax表示
v-(x*y+z-540)
idiv x ;(v-(x*y+z-540))/x,
ax商,
dx餘數
三目運算子對比三個 06運算子大全c語言值得收藏
算術運算子 三目運算子 關係運算子 邏輯運算子 位運算子 逗號運算子 算術運算子在小學的時候已經運用得爐火純青了,主要包含 加 減 乘 除 取餘 取模 剩下的兩個需要特別注意 自增 自減 遵循talk is cheap,show me code的原則,先上 int i 4 i printf i d ...
C 中三目運算子做左值
c語言返回變數的值,c 語言是返回變數本身 c語言中的三目運算子返回的是變數值,不能做為左值使用 c 中的三目運算子可直接返回變數本身,因此可以出現在程式的任何地方 三目運算子可能返回的值中如果有乙個是常量值,則不能作為左值使用 a b 1 b 30 c語言如何支援類似c 的特性呢?當左值的條件 要...
c 三目運算子顯示最大值
c 實現三目運算子顯示最大值 思路 宣告輸入數字型別,使用if else語句,先用三目運算子判斷a和b二者,誰大,再用大的與c對比,如果c大則輸出c。反之則執行else裡的三目運算子,輸出大的。下面展示一些內聯 片。an highlighted block int a,b,c console.wri...