- a=ds:[si],那么a[sp]=ds:[si+sp]
- dw a,b=dw offset a,offset b
- a,b=dw offset a,seg a,offset b,seg b
assume cs:code,ds:data ;ds=076a
data segment
db 9,9,9,9 ;09 09 09 09
a dw 1234h,2345h ;34 12 45 23
b dd 3456h ;56 34 00 00
d dw a,b ;04 00 08 00
e dw offset a,offset b ;04 00 08 00
f dd a,b ;04 00 6A 07 08 00 6A 07
g dd offset a,offset b ;04 00 00 00 08 00 00 00
h dw offset a,seg a,offset b,seg b ;04 00 6A 07 08 00 6A 07
data ends
code segment
start:
mov ax,data ;//默认段地址是ds但a和b在data里,所以必须设置ds
mov ds,ax
mov si,0
s:
mov ax,a[si]
add word ptr b,ax
;add word ptr b[2],ax ;//加在56 34 00 00的00 00上
;add word ptr b[1],ax ;//加在56 34 00 00的34 00上
adc word ptr b[2],0
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
(重要)查询部分度数的sin值:
assume cs:code,ds:data
data segment
table dw v0,v30,v60,v90,v120,v150,v180
v0 db '0','$'
v30 db '0.5','$'
v60 db '0.886','$'
v90 db '1','$'
v120 db '0.886','$'
v150 db '0.5','$'
v180 db '0','$'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,120
call sin
mov ax,4c00h
int 21h
sin:
push dx
push ax
push si
mov dl,30
div dl
;mov dx,2 ;//table dw,所以乘以2
;mul dx
mov ah,0
mov si,ax
add si,si ;//或者用上面的乘法
;//si=8,table[8]=offset v120,所以dx=table[si]即可
mov dx,table[si]
mov ah,9
int 21h
pop si
pop ax
pop dx
ret
code ends
end start
注意b和offset b的区别
b时b[0]处的值,offset b是偏移量
assume cs:code,ds:data
data segment
a db 'abc' ;//61 62 63 34 12 00 00 00
b dw 1234h
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,b ;//b=b[0],这句代码=mov ax,b[0],所以ax=1234
mov bx,offset b ;//bx=0003
inc b ;//61 62 63 35 12 00 00 00
mov ax,b ;//ax=1235
mov bx,offset b ;//bx=0003
mov ax,4c00h
int 21h
code ends
end start