阅读 89

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 复制代码

偏移地址组合

  1. ds:[bx+数字]

    ds:[bx+数字] ;如果写成[数字+bx],那么相当于[bx]+数字,两者意思不一样 复制代码

  2. ds:[bx+si]和ds:[bx+si+数字]

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

偏移地址组合实际应用

  1. 需求:首字母变成大写

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. 需求:所有字母变成大写

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


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐