数据的位置和长度
Time: 2019-12-16 Tags: binaryLink: 数据的位置和长度
世界上有10种人,一种懂二进制,一种不懂二进制。
数据位置的表达
立即数
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为立即数(idata)。
例如:
mov ax,1
add bx,2000h
or bx,00010000b
mov al,"a"
寄存器
指令要处理的数据在寄存器里。
段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出。
有的段地址默认在ds中,有的段地址默认在ss中,有的段地址可以显性指出。
数据的长度
8086的两种尺寸
一般分为字操作和字节操作。
通过寄存器指明字操作还是字节操作。
例如:
mov ax,1
mov bx,ds:[0]
mov al,1
mov al,bl
...
用操作符 X ptr 指明内存单元的长度,X 在汇编指令中可以为word或byte。
例如:
mov word ptr ds:[0],1
inc word ptr [bx]
mov byte ptr ds:[0],1
inc byte ptr [bx]
例如,我们用debug查看内存的结果如下:
2000:1000 FF FF FF FF FF FF ......
那么指令:
mov ax,2000h mov ds,ax mov byte ptr [1000h],1
将会将内存内容修改为:
2000:1000 01 FF FF FF FF FF ......
而指令:
mov ax,2000h mov ds,ax mov word ptr [1000h],1
将会将内存内容修改为:
2000:1000 01 00 FF FF FF FF ......
规定了长度的。
比如push指令,只能进行字操作。
一个实例
寻址方式的综合运用(王爽《汇编语言》实验七)
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,14417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ??')
table ends
codesg segment
start:mov ax,data
mov ds,ax ;ds中存放data段的位置,然后用bx+idata进行访问
mov ax,table
mov es,ax
mov bx,0
mov si,0 ;si负责访问table段,换行则add 10h
mov di,0 ;访问table同一行的不同位置的时候直接加一个idata就行了
mov cx,15h
s:mov ax,[bx]
mov es:[si],ax
mov ax,[bx+2]
mov es:[si+2],ax
mov ax,ds:[bx+54h]
mov es:[si+5],ax
mov ax,ds:[bx+56h]
mov es:[si+7],ax
mov ax,ds:[di+00a8h]
mov es:[si+0ah],ax
mov ax,ds:[bx+54h]
mov dx,ds:[bx+56h]
div word ptr ds:[di+00a8h]
mov es:[si+0dh],ax
add si,16
add di,2
add bx,4
loop s
mov ax,4c00h
int 21h
codesg ends
end start