x86汇编-变址寻址-19

129 阅读1分钟

变址寻址

  • 使用SI/DI给出偏移地址 且不指定段寄存器时 默认使用段寄存器DS
    mov [si], dx ; dx的数据放到一个内存地址 内存地址由si寄存器给出
    mov ax, [di] ; di内存地址的数据放到ax寄存器
  • 变址寻址允许在SI/DI基础上加上偏移量 mov [si+0x100], al
    mov byte[di+message], 0x80

使用变址寻址和栈反转字符串

源字符串 ABCDEFG
输出字符串 GFEDCBA

	jmp start

message db 'ABCDEFG'

start:
	mov ax, 0x07c0
	mov ds, ax		; 设置段寄存器
	
	mov ax, 0xb800
	mov es, ax		; 设置附加段寄存器
	
	mov ax, cs
	mov ss, ax		; 栈段寄存器
	mov sp, 0		; 栈指针寄存器
	
	mov si, message	; 指向字符'A'
	mov cx, start-message	; 循环次数
  pushstack:		; 数据入栈
	mov ax, [si]	
	push ax
	inc si
	loop pushstack

	xor ax, ax
	mov cx, start-message
	mov di, 0
  reverse:
	pop ax
	mov [es:di], al
	inc di
	mov byte [es:di], 0x07
	inc di
	loop reverse

jmp $
times 510-($-$$) db 0
db 0x55, 0xaa

结果

捕获.PNG