文章目录
解析
movsb指令(mov string byte)
以ds:si为源地址,es:di为目的地址进行传送,每次传送一个字节
cx指定传送次数
DF寄存器设置数据读取以及数据填入的方向
DF=0时,每次操作后si、di递增
DF=1时,每次操作后si、di递减
cld指令将DF置0
std指令将DF置1
movsw指令(mov string word)
以ds:si为源地址,es:di为目的地址进行传送,每次传送一个字
cx指定传送次数
当标志寄存器中标志位DF设置数据读取以及数据填入的方向
DF=0时,每次操作后si、di递增
DF=1时,每次操作后si、di递减
cld指令将DF置0
std指令将DF置1
jns指令(jmp not sf)
1、
条件跳转指令
根据标志寄存器中标志位SF(也称符号位)的值判断是否跳转
SF=0时,发生跳转
SF=1时,则不跳转
2、
与跳转指令js刚好相反
3、
dec指令影响标志位SF
当dec指令计算结果的最高位,也就是符号位为0时,SF置0,符号位为1时,SF置1
效果
movsb指令显示"Hello"
movsw指令显示"BOCHS"
jns指令显示"HelloBOCHS"
代码
前期准备
start:
jmp code
data:
;也可使用ASCII码
text0 db 'H',0x07,'e',0x07,'l',0x07,'l',0x07,'o',0x07
text1 db 'B',0x07,'O',0x07,'C',0x07,'H',0x07,'S',0x07
code:
;es:di指向目的内存地址
mov ax,0xB800
mov es,ax
mov di,0x0
;ds:si指向源内存地址
mov ax,0x07c0
mov ds,ax
mov si,text0
批量传送指令 movsb
;#####################字符串"Hello"打印,单个byte为传送单位
;传送次数
mov cx,text1-text0
;由低地址到高地址传送
cld
;传送开始
rep movsb
批量传送指令 movsw
;换行显示
mov di,160
;#####################字符串"BOCHS"打印,两个byte为传送单位
;传送次数
mov cx,(code-text1)/2
;由低地址到高地址传送
cld
;传送开始
rep movsw
条件转移 jns
;换行显示
mov di,320
;#####################条件跳转传送
;ds:si指向源内存地址
mov ax,0x07c0
mov ds,ax
mov si,text0
;传送次数
mov cx,code-text0
dec cx
l:
;al做中转站
mov al,[ds:si]
inc si
mov byte [es:di],al
inc di
dec cx
jns l
字符填充
jmp $
current:
;字符填充
times 510-(current-start) db 0
db 0x55,0xAA ;BIOS要求:0x55,0xAA结尾