x86汇编语言之DI和SI寄存器
概念
SI(source index)是源变址寄存器 DI(destination index)是目的变址寄存器 它们和[bx]类似,用于存放偏移地址
代码示例
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 复制代码
改成栈复制:
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 复制代码
偏移地址组合
ds:[bx+数字]
ds:[bx+数字] ;如果写成[数字+bx],那么相当于[bx]+数字,两者意思不一样 复制代码
ds:[bx+si]和ds:[bx+si+数字]
ds:[bx+di]和ds:[bx+di+数字]
偏移地址组合实际应用
需求:首字母变成大写
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 复制代码
需求:所有字母变成大写
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
作者:乱码三千
链接:https://juejin.cn/post/7023964970261938190