前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >x86汇编语言之DI和SI寄存器

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

作者头像
乱码三千
发布2021-08-24 14:53:33
1.9K0
发布2021-08-24 14:53:33
举报
文章被收录于专栏:乱码三千乱码三千

概念

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

代码示例

代码语言:javascript
复制
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

改成栈复制:

代码语言:javascript
复制
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+si]和ds:[bx+si+数字]

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

偏移地址组合实际应用
  1. 需求:首字母变成大写
代码语言:javascript
复制
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. 需求:所有字母变成大写
代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱码三千 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
    • 代码示例
      • 偏移地址组合实际应用
  • 偏移地址组合
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档