- 只要在[]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中。
- mov ax,[bp] 含义:(ax) = ((ss)*16+(bp))
- mov ax,[bp+idata] 含义:(ax) = ((ss)*16+(bp)+idata)
- mov ax,[bp+si] 含义:(ax) = ((ss)*16+(bp)+(si))
- mov ax,[bp+si+idata] 含义:(ax) = ((ss)*16+(si)+idata)
- 寻址方式:
- 直接寻址:
- 表达式: [idata]
- 直接根据常量寻址,在C语言中表示为arr[0]
- 寄存器间接寻址:
- 表达式:[bx]、[si]、[di]、[bp]
- 根据寄存器的数据寻址,在C语言中表示为arr[i]
- 寄存器相对寻址:
- 表达式:[bx+idata]、[si+idata]、[di+idata]、[bp+idata]
- 根据寄存器和常量寻址,在C语言中表示为arr[i+10]
- 基址变址寻址:
- 表达式:[bx+si+idata]、[bx+di+idata]、[bp+si+idata]、[bp+di+idata]
- 根据两个寄存器和一个常量寻址,在C语言中表示为arr[i+j+5]
- 要操作的数据的长度:
- 如果操作符两边有寄存器,以寄存器的大小确定操作的是字还是字节。
- 如果没有寄存器,可以自行指定:
- mov word ptr [2],1
- mov byte ptr [2],1
- 有些指定默认指定了访问的是字还是字节:
- 比如push [1000h]默认操作的是字。
- div指
- data segment中:
- db(data byte)定义的是字节型数据,每1个数据占1个字节。
- dw(data word)定义的是字型数据,每1个数据占1个字,即2个字节。
- dd(data double word)定义的是双字型数据,每1个数据占2个字,即4个字节。
- 问题8.1
assume cs:codesg, ds:datasg datasg segment dd 100001 dw 100 dw 0 datasg ends codesg segment start: mov ax,datasg mov ds,ax mov dx,ds:[2] ;注意高位在低位后面 mov ax,ds:[0] div word ptr ds:[4] mov ds:[6],ax codesg ends end start