类型转换指令(带符号数的拓展)
乘法指令
除法指令
计算16位带符号数的加减乘除:(v-(x*y+z-540))/x
data segment
x dw 2000 ;07d0h
y dw 4000 ;0fa0h
z dw 3000 ;0bb8h
v dw 6000 ;1770h
w dw ?,?
data ends
stack segment stack
top label word
dw 100 dup (?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
;(v-(x*y+z-540))/x
mov ax,x
imul y ;结果为007A1200h,dx=007Ah,ax=1200h
add ax,z
adc dx,0 ;结果为007A1DB8h,dx=007Ah,ax=1DB8h
sub ax,540
sbb dx,0 ;结果为007A1B9Ch,dx=007Ah,ax=1B9Ch
mov cx,ax
mov bx,dx
mov ax,v
cwd ;带符号数v从16位拓展成32位,需要用cwd
sub ax,cx
sbb dx,bx ;结果为FF85FBD4h/-7996460,dx=0FF85h,ax=FBD4h
idiv x ;dx=FE34h(余数),ax=F062h(商)
mov w,ax
mov w+2,dx
mov ah,4ch
int 21h
main endp
code ends
end main
计算16位带符号数的加减乘除:W=(X+3*Y-45)/Z
计算带符号数W=(X+3*Y-45)/Z
X,Y,Z均为16位带符号数,商保存在W,余数保存在W+2
data segment
X dw -2000
Y dw 300
Z dw -100
w dw ?,?
data ends
stack segment stack
top label word
dw 100 dup (?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov ax,3
imul Y ;16位*16位=32位(dx,ax)
mov cx,ax ;因为类型拓展是在ax,要先保存3*Y
mov bx,dx
mov ax,X
cwd ;带符号数X16位拓展成32位
add ax,cx
adc dx,bx ;高字带进位加
sub ax,45
sbb dx,0 ;高字带借位减
idiv Z ;32位除以16位,结果为16位,商在ax,余数在dx
mov W,ax
mov W+2,dx
mov ah,4ch
int 21h
main endp
code ends
end main