汇编学习--第十三天
11.12 标志寄存器在Debug中的表示
OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1.
SF sign Flag 符号标志 记录运算结果的符号,结果负时为1.
ZF zero flag 零标志 运算结果等于0时为1,否则为0.
CF carry flag 进位标志 最高有效位产生进位时为1,否则为0.
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0.
PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0.
DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大.
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断.
TF trap flag 陷阱标志 用于调试单步操作
|
of |
df |
if |
sf |
zf |
af |
pf |
cf |
标志位为1 |
ov |
dn |
ei |
ng |
zr |
ac |
pe |
cy |
标志位为0 |
nv |
up |
di |
pl |
nz |
na |
po |
nc
|
与debug右边的八位一一对应。
11.9 检测比较结果的条件转移
即根据条件来判断是否改变IP
例如jcxz,大多数条件转移指令,通过检测标志寄存器(被cmp影响的寄存器)的相关标志位的结果,来判断是否修改IP。
无符号数比较:检测zf,cf
有符号及比较:检测sf,of,zf
指令 | 含义 | 检测的相关标志位 |
je | 等于则转移 | zf=1 |
jne | 不等于则转移 | zf=0 |
jb | 低于则转移 | cf=1 |
jnb | 不低于则转移 | cf=0 |
ja | 高于则转移 | zf=0且cf=0 |
jna | 不高于则转移 | cf=1或zf=1 |
实现如果(ah)=(bh),则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)
assume cs:code code segment start: cmp ah,bh je s add ah,bh jmp short ok s: add ah,ah ok: mov ax,4c00h int 21h code ends end start
je判断的是zf位置,不管之前有什么命令,只要zf=1,则转移。
assume cs:code code segment start: mov ax,0 add ax,0 je s inc ax s: inc ax mov ax,4c00h int 21h code ends end start
编程统计data段中数值为8的字节个数,ax保存结果。
assume cs:code data segment db 8,11,81,8,6,63,55,8 data ends code segment start: mov ax,data mov ds,ax mov si,0 mov cx,8 mov ax,0 s: cmp byte ptr [si],8 jne next inc ax next: inc si loop s mov ax,4c00h int 21h code ends end start
2.编程统计大于8的个数,用ax保存结果。
assume cs:code data segment db 8,11,81,8,6,63,55,8 data ends code segment start: mov ax,data mov ds,ax mov si,0 mov cx,8 mov ax,0 s: cmp byte ptr [si],8 ja ok jmp short next ok: inc ax next: inc si loop s mov ax,4c00h int 21h code ends end start
3.统计小于8的个数,结果保存在ax
assume cs:code data segment db 8,11,81,8,6,63,55,8 data ends code segment start: mov ax,data mov ds,ax mov si,0 mov cx,8 mov ax,0 s: cmp byte ptr [si],8 jb ok jmp short next ok: inc ax next: inc si loop s mov ax,4c00h int 21h code ends end start
检测点 11.3
(1)
jb s0
ja s0
(2)
jna s0
jnb s0
11.10 DF标志和串传送指令
在串指令中,控制每次操作之后si,di的增减。
DF=1 每次操作之后,si,di递减
DF=0 每次操作之后,si,di递增
rep作用:根据cx,反复执行后面的串传送指令
rep movsb(repeat move string byte)
rep movsw(repeat mov string word)
对CF位进行操作
cld( Clear Director):将标志寄存器的df位清0
std(Set Director):将标志寄存器的df位设置为1
1.使用串传送指令,将data段中的第一个字符串复制到他后面的空间中
assume cs:code data segment db 'Welcome to masm!' data ends code segment start: mov ax,data mov ds,ax mov es,ax mov si,0 mov di,10h mov cx,16 cld rep movsb mov ax,4c00h int 21h code ends end start
2.利用串传送指令,将F000H段中最后16个字符复制到data段中
assume cs:code data segment db 16 dup (0) data ends code segment start: mov ax,data mov es,ax mov ax,0F000H mov ds,ax mov si,0ffffh mov di,15 mov cx,16 std rep movsb mov ax,4c00h int 21h code ends end start
也可以顺序存储
assume cs:code data segment db 16 dup (0) data ends code segment start: mov ax,data mov es,ax mov ax,0F000H mov ds,ax mov si,0fff0h mov di,0 mov cx,16 cld rep movsb mov ax,4c00h int 21h code ends end start
11.11 pushf和popf
pushf 将标志寄存器的值压入栈中
popf 将标志寄存器的值弹出栈中
检测点11.4
对flag寄存器操作
ax=45h
mov ax,0 push ax popf;将标志寄存器置 mov ax,0fff0h add ax,0010h ;ax实际结果为0,应得结果:-16+16=0 ;flag寄存器值:0000 0000 0100 0101=69 pushf;将标志寄存器值入栈 pop ax;将标志寄存器值出栈给ax and al,1100 0101b;0100 0101 and ah,0000 1000b;0000 0000 ;所以ax=0000 0000 0100 0101=45h
实验 11 编写子程序
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
cmp byte ptr [si],97
jb next
cmp byte ptr [si],122
ja next
and byte ptr [si],11011111b
next:
mov cl,[si]
mov ch,0
jcxz ok
inc si
jmp short letterc
ok:
ret
codesg ends
end start