偏移地址

Tutorial: 汇编基础 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. 偏移地址组合
2000:1000:BE 00 06 00 00 00
              0  1  2  3  4
mov ax,2000H
mov ds,ax
mov bx,1000H

mov ax,ds:[bx]   ax = 00BEH
mov cx,ds:[bx+1] cx = 0600H
add cx,ds:[bx+2] cx = 0600H + 0006H = 0606H
-d ds:1000
2000:1000  BE 00 06 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-d ds:1001
2000:1000     00 06 00 00 00 00 00-00 00 00 00 00 00 00 00    ...............

-d ds:1002
2000:1000        06 00 00 00 00 00-00 00 00 00 00 00 00 00     ..............
2. 优化大小写转换
ASSUME CS:code,DS:data

data SEGMENT
       DB 'ABcDEF'
       DB 'GhiJkm'
data ENDS

code SEGMENT
  start:
                mov  ax, data
                mov  ds,ax

                mov  cx,6
                mov  bx,0

  convertLetter:mov  dl,ds:[bx]
                or   dl,00100000B
                mov  ds:[bx],dl

                mov  dl, ds:[bx+6]
                and  dl,11011111B
                mov  ds:[bx+6],dl

                inc  bx
                loop convertLetter


                mov  ax,4C00H
                int  21h

code ENDS
END start
-u
0E25:0000 B8240E        MOV     AX,0E24
0E25:0003 8ED8          MOV     DS,AX
0E25:0005 B90600        MOV     CX,0006
0E25:0008 BB0000        MOV     BX,0000
0E25:000B 8A17          MOV     DL,[BX]
0E25:000D 80CA20        OR      DL,20
0E25:0010 8817          MOV     [BX],DL
0E25:0012 8A5706        MOV     DL,[BX+06]
0E25:0015 80E2DF        AND     DL,DF
0E25:0018 885706        MOV     [BX+06],DL
0E25:001B 43            INC     BX
0E25:001C E2ED          LOOP    000B
0E25:001E B8004C        MOV     AX,4C00
-g 1E

AX=0E24  BX=0006  CX=0000  DX=004D  SP=0000  BP=0000  SI=0000  DI=0000
DS=0E24  ES=0E14  SS=0E23  CS=0E25  IP=001E   NV UP EI PL NZ NA PE NC
0E25:001E B8004C        MOV     AX,4C00
-d ds:0
0E24:0000  61 62 63 64 65 66 47 48-49 4A 4B 4D 00 00 00 00   abcdefGHIJKM....
3. SI DI
  • AX,BX,CX,DX,SP,BP,SI,DI
    • AX: 容器
    • BX: 偏移地址常用, 可以 [bx+1]
    • CX: 循环
    • DX: 容器, 偏移地址寄存器
    • SP: 栈偏移地址
    • BP: 相当于 ds:[bx+si], ss:[bp+si], bp 相当于 dx, 但是 bp 是给 ss 栈用的
    • SI:偏移地址常用,多搭配 ds[si],ds[bx+si]
    • DI:偏移地址常用,多搭配 es[di],es[bx+di]
  • DS,ES,SS,CS,IP
    • DS: data 数据段, 数据从哪里来
    • ES: destination, 数据到哪里去
    • SS: stack 栈段
    • CS: code 指令段
    • IP: 指令偏移地址

方法 1

ASSUME CS:code,DS:data
;  题目:将上面的字符串,复制到下面

data SEGMENT
       DB 'welcome to mams!'
       DB '................'
data ENDS

code SEGMENT
  start:
           mov  ax,data
           mov  ds,ax
           mov  es,ax

           mov  si,0
           mov  di,16
           mov  cx,16       ; 也可以将cx=8

  copyData:mov  dl,ds:[si]  ; mov dx,ds:[si], 一次复制一个字
           mov  es:[di],dl  ; mov es:[di],dx
           inc  si          ; add si,2
           inc  di          ; add di,2
           loop copyData

           mov  ax,4C00H
           int  21h

code ENDS
END start
-u
0E26:0000 B8240E        MOV     AX,0E24
0E26:0003 8ED8          MOV     DS,AX
0E26:0005 8EC0          MOV     ES,AX
0E26:0007 BE0000        MOV     SI,0000
0E26:000A BF1000        MOV     DI,0010
0E26:000D B91000        MOV     CX,0010
0E26:0010 8A14          MOV     DL,[SI]
0E26:0012 26            ES:
0E26:0013 8815          MOV     [DI],DL
0E26:0015 46            INC     SI
0E26:0016 47            INC     DI
0E26:0017 E2F7          LOOP    0010
0E26:0019 B8004C        MOV     AX,4C00
0E26:001C CD21          INT     21
0E26:001E 26            ES:
0E26:001F 8F063C00      POP     [003C]
-g 19

AX=0E24  BX=0000  CX=0000  DX=0021  SP=0000  BP=0000  SI=0010  DI=0020
DS=0E24  ES=0E24  SS=0E23  CS=0E26  IP=0019   NV UP EI PL NZ AC PO NC
0E26:0019 B8004C        MOV     AX,4C00
-d ds:0
0E24:0000  77 65 6C 63 6F 6D 65 20-74 6F 20 6D 61 6D 73 21   welcome to mams!
0E24:0010  77 65 6C 63 6F 6D 65 20-74 6F 20 6D 61 6D 73 21   welcome to mams!

方法 2:

ASSUME CS:code,DS:data
;  题目:将上面的字符串,复制到下面 => 经典

data SEGMENT
       DB 'welcome to mams!'
       DB '................'
data ENDS

stack SEGMENT stack
        DW 0,0,0,0,0,0,0,0
        DW 0,0,0,0,0,0,0,0
stack ENDS

code SEGMENT
  start:   mov  ax,stack
           mov  ss,ax
           mov  sp,32     ; 16个字大小

           mov  ax,data
           mov  ds,ax
           mov  es,ax

           mov  si,0
           mov  di,16
           mov  cx,8

  copyData:push ds:[si]
           pop  es:[di]
           add  si,2
           add  di,2
           loop copyData

           mov  ax,4C00H
           int  21h

code ENDS
END start
4.字母的 ascii 码
  • a - z: 97 - 122
  • A - Z: 65 - 90
5.BX SI DI
2000:1000:BE 00 06 00 00 00
              0  1  2  3  4
mov ax,2000H
mov ds,ax
mov bx,1000H

mov si,0
mov ax,ds:[bx+si]     ax = 00BE
inc si                si = 1
mov cx,ds:[bx+si]     cx = 0600H
inc si                si = 2
mov di,si             di = 2
add cx,ds:[bx+di]     cx = 0600H + 0006H = 0606H
6.BX SI DI 数字
2000:1000:BE 00 06 00 6A 22
              0  1  2  3  4
mov ax,2000H
mov ds,ax
mov bx,1000H

mov si,0
mov ax,ds:[bx+si+2]     ax = 0006H
inc si                  si = 1
mov cx,ds:[bx+si+2]     cx = 6A00H
inc si                  si = 2
mov di,si               di = 2
add cx,ds:[bx+di+2]     cx = 6A00H + 226AH = 8C6AH