x86汇编学习-附加段寄存器ES-15

172 阅读2分钟

附加段寄存器

ES寄存器
当需要操作两个段的数据时 需要不停的切换ds数据段寄存器的值 附加段寄存器的作用就是解决频繁给ds寄存器赋值的操作
DS寄存器指向一块空间 ES寄存器指向另一块空间
使用数据直接用偏移地址 当需要使用ES的空间时指定[es:段内偏移地址]

代码

start:
	mov ax, 23333	; 被除数低16位
	xor dx, dx		; 被除数高16位
	mov bx, 10		; 除数
	
	mov cx, 0
	mov ds, cx		; 设置数据段起始地址
	
	div bx			; 执行除法
	add dl, 0x30	; 数字转字符
	mov [0x7c00+buffer], dl	; 放到buffer内存空间第一个位置
	xor dx, dx		; 清空dx寄存器 准备下次除法
	
	div bx
	add dl, 0x30
	mov [0x7c00+buffer+1], dl
	xor dx, dx
	
	div bx
	add dl, 0x30
	mov [0x7c00+buffer+2], dl
	xor dx, dx
	
	div bx
	add dl, 0x30
	mov [0x7c00+buffer+3], dl
	xor dx, dx
	
	; 23333的最后一个数位解析完成
	div bx
	add dl, 0x30
	mov [0x7c00+buffer+4], dl
	xor dx, dx
	
	mov cx, 0xb800
	mov es, cx		; es寄存器指向显存起始位置
	
	mov al, [0x7c00+buffer+4]	; 取出内存里面的字符2
	mov [es:0x00], al			; 将字符2写入显存
	mov byte[es:0x01], 0x2f			; 设置字符2的显示状态
	
	mov al, [0x7c00+buffer+3]
	mov [es:0x02], al
	mov byte[es:0x03], 0x2f		; 0x2f是立即数 立即数可大可小 需要使用byte指定目标大小
	
	mov al, [0x7c00+buffer+2]
	mov [es:0x04], al
	mov byte[es:0x05], 0x2f
	
	mov al, [0x7c00+buffer+1]
	mov [es:0x06], al
	mov byte[es:0x07], 0x2f
	
	mov al, [0x7c00+buffer]
	mov [es:0x08], al
	mov byte[es:0x09], 0x2f

loop:
	jmp short loop

buffer db 0, 0, 0, 0, 0

current:
	times 510-(current-start) db 0

db 0x55, 0xaa

结果展示

捕获.PNG