[18.1]–寄存器、立即数和直接寻址
寄存器寻址
立即数寻址
⭐️ 标号本质上是个汇编地址,在编译阶段会转换为一个立即数
内存寻址
CS / DS / ES / SS
.
[18.2]–基址寻址
![在这里插入图片描
⭐️如果使用了基址寄存器BX,默认的段寄存器是DS,此时使用DS+BX形成物理地址
如果使用了基址寄存器BP,默认的段寄存器是SS,此时使用SS+BP形成物理地址,如果使用BP,则可以省略超越前缀SS
.
[18.3]–变址寻址
使用SI、DI
mov [si],dx ; DX内容复制到:物理地址为(DS内容左移4位 + SI内容)存储单元中
add ax, [di] ; 物理地址为(DS内容左移4位 + DI内容)存储单元的一个字内容,
; 加上AX的内容,让如AX中
xor word [si], 0x8000 ; 物理地址为(DS内容左移4位 + SI内容)存储单元一个字内容,异或立即数0x8000,
; 结果放入上面的物理地址中
; -------------- 就地反转字符串的内容,即按照相反的顺序存储在原来的位置 --------------
; BX 存储字符串的开始位置,循环从内存物理地址 [DS:BX] 处取字符,压栈,inc BX
jmp start
str: db 'abcdefghijklmnopqrstuvwxyz'
start:
mov ax,0x7c0 ; 主引导扇区程序,加载到内存后,所在的物理地址是0x07c00
mov ds,ax ; 0x7c0 放入DS寄存器
mov ax cs ;
mov ss,ax ; 代码段寄存器CS内容放入SS,此时DS和SS内容就相同了
mov sp, 0 ; 初始化栈顶指针寄存器SP
mov cx, start - str ; 计数寄存器CX设置循环的次数,循环次数为字符串长度
mov bx, str ; 基址寄存器BX中,放入字符串的段内偏移量
lppush:
mov al, [bx] ;取出字符,从DS+BX的内存总取出一个字节内容,即一个字符
push ax ; 将取出的字符入栈, 注意:push操作必须是一个字
inc bx ;
loop lppush ;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
[18.4]–基址变址寻址
⭐️ BP使用段寄存器SS
.
[18.5]–原书第1版第7章 检测点 和习题解析
.