df位、串传送

昨天高中同学会,今天白天又有事,所以决定把标志寄存器这章结束掉,下面是串操作笔记
movsb:
传送一个字节
相当于:
(1) ((es)*16+di)=((ds)*16+si)
(2) df=0 (si)=(si)+1
(di)=(di)+1
df=1 (si)=(si)-1
(di)=(di)-1
movsw:
传送一个字
rep movsb相当于:
s:movsb
loop s
可见rep是根据cx进行循环的

cld指令:df清零
std指令:df置1

下面写出利用movsb与rep配合copy字符串:
assume cs:code,ds:data,es:extra
data segment
db ‘welcome to masm!’
data ends
extra segment            ;事实上不需要两个段,但这样更清晰
db 16 dup (0)
extra ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
mov si,0
mov di,0
mov cx,16
cld

rep movsb

mov ax,4c00h
int 21h
code ends
end start

书中未写出对串的其他操作,下面仅写出利用movsb倒序copy字符串的程序:
assume cs:code,ds:data,es:extra
data segment
db ‘welcome to masm!’
data ends
extra segment
db 16 dup (0)
extra ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
mov si,0
mov di,15
mov cx,16

cld

s:    movsb            ;因为si加1的同时,di要减1,所以不能rep movsb
sub di,2        ;movsb后di加了1,这里手动减2,从而实现di减1的效果
loop s

mov ax,4c00h
int 21h
code ends
end start
接下来就是中断的学习了,事实上,到此为止的内容以前就比较熟悉,所以复习的较快,以前学中断只是水水的看了些片段,接下来要重点学习了,尽管实际上这部分对win32下的反汇编意义不大。。

adc sbb cmp与条件转移

1.adc和sbb是带进(借)位加减法,理论上可以实现任意长度数据加减法
下面是示例:
assume cs:code,ds:data
data segment
dw    1122h,3344h,5566h,7788h
dw    1020h,3040h,5060h,7080h
data ends
code segment
start:
mov ax,data
mov ds,ax
xor si,si
mov di,8
mov cx,4

sub ax,ax        ;CF清零
s:    mov ax,[di]
adc [si],ax
inc si            ;不能用add,add会影响CF,而inc与loop不会
inc si
inc di
inc di
loop s

mov ax,4c00h
int 21h
code ends
end start
2.cmp ax,bx    相当于sub ax,bx 只是仅根据结果改变标志位,并不真正运算写入
3.无符号数条件转移:
je
jne
jb
jnb
ja         zf=0并且cf=0
jna         zf=1或cf=1
4.有符号数条件转移:
JG∶——(有符号数比较)大于转移(等价JNLE)。SF和OF同号,且ZF=0 时转移。(段内直接短转移)

JGE∶ ——(有符号数比较)大于或等于转移(等价于JNL)。 当SF和OF同号,或ZF=1, 则转移(段内直接短转移)。

JL∶ ——(有符号数比较)小于转移(等价于JNGE)。当SF和OF异号,且ZF=0 时转移(段内直接短转移)。

JLE∶——(有符号数比较)小于或等于转移(等价于JNG)。当SF和OF异号或ZF=1时转移(段内直接短转移)。

JNG∶——(有符号数比较)不大于转移(等价于JLE)。当SF和OF异号或ZF=1时转移(段内直接短转移)。

JNGE∶——(有符号数比较)不大于且不等于转移(等价于JL)。当SF和OF异号,且ZF=0 时转移(段内直接短转移)。

JNL∶——(有符号数比较)不小于时转移(等价于JGE)。 当SF和OF同号,或ZF=1, 则转移(段内直接短转移)。

JNLE∶——(有符号数比较)不小于且不等于转移(等价JG)。SF和OF同号,且ZF=0 时转移。
简记口诀:(zf=0时)sf和of:同号>,异号<
5.*溢出时SF位的值和真实结果的符号相反。