偏移地址
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