数据的位置和长度 Surager

世界上有10种人,一种懂二进制,一种不懂二进制。

数据的位置

数据位置的表达

  1. 立即数

    对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为立即数(idata)。

    例如:

mov ax,1

add bx,2000h

or bx,00010000b

mov al,"a"

  1. 寄存器

    指令要处理的数据在寄存器里。

  2. 段地址(SA)和偏移地址(EA)

    指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出。

    有的段地址默认在ds中,有的段地址默认在ss中,有的段地址可以显性指出。

数据的长度

8086的两种尺寸

一般分为字操作字节操作

  1. 通过寄存器指明字操作还是字节操作。

    例如:

    mov ax,1

    mov bx,ds:[0]

    mov al,1

    mov al,bl

    ...

  2. 用操作符 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 ......

  3. 规定了长度的。

    比如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