x86汇编语言之DI和SI寄存器

概念

SI(source index)是源变址寄存器
DI(destination index)是目的变址寄存器
它们和[bx]类似,用于存放偏移地址

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
assume cs:code,ds:data

;需求:字符串复制到...位置
data segment
db 'welcome to masm!'
db '................'
data ends

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

mov si,0
mov di,16

mov cx, 8
copydata:
mov dx,ds:[si]
mov es:[di],dx
add si,2
add di,2
loop copydata

code ends


end start

改成栈复制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
assume cs:code,ds:data

;需求:字符串复制到...位置
data segment
db 'welcome to masm!'
db '................'
data ends

stack segment
db 32 dup(0)
stack ends

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

mov ax,stack
mov ss,ax
mov sp,32

mov si,0
mov di,16

mov cx, 8
copydata:
push ds:[si]
pop es:[di]
add si,2
add di,2
loop copydata

code ends


end start

偏移地址组合

  1. ds:[bx+数字]

    1
    ds:[bx+数字] ;如果写成[数字+bx],那么相当于[bx]+数字,两者意思不一样
  2. ds:[bx+si]和ds:[bx+si+数字]

  3. ds:[bx+di]和ds:[bx+di+数字]

偏移地址组合实际应用

  1. 需求:首字母变成大写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
assume cs:code ,ds:data
; 需求:首字母变成大写
data segment
db '1. file '
db '2. edit '
db '3. search '
data ends


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

mov bx,0
mov si,3

mov cx,3
upLetter:
mov dl,ds:[bx+si]
and dl,11011111B
mov es:[bx+si],dl
add bx,16
loop upLetter

code ends

end start
  1. 需求:所有字母变成大写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
assume cs:code ,ds:data,ss:stack
; 需求:所有字母变成大写
data segment
db '1. file '
db '2. edit '
db '3. sear '
data ends

stack segment
db 32 dup(0)
stack ends


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

mov ax,stack
mov ss,ax
mov sp,32

mov bx,0
mov si,3

mov cx,3
upRow: ;使用两层循环, 因为内循环需要用到cx和si寄存器,避免数据被覆盖,使用栈临时保护
push cx
push si

mov cx,4
upLetter:
mov dl,ds:[bx+si]
and dl,11011111B
mov es:[bx+si],dl
inc si
loop upLetter

add bx,16
pop si
pop cx
loop upRow

code ends

end start

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%