因为此次复习主要是针对考试范围进行的,因此,将PPT里的例程自己按照考题的划分手撸了一遍。
数据的移位和处理
数据的移位和处理考察点应该在几个基本位操作指令的搭配使用上。移位操作可分为移位和循环移位两大类。
加粗样式移位指令又可分为逻辑移位和算数移位。
- 逻辑移位:适用于无符号数,包括SHL和SHR两种。
- 算术移位:适用于有符号数,包括SAL和SAR两种,与逻辑移位的区别体现在右移上,算术右移最高位不变。
循环移位根据是否带进位分成两种: - 不带进位:ROL和ROR两种,CF位只起到拍照的作用,并不参与移位的循环
- 带进位:RCL和RCR两种,CF位作为最高位参与循环。
//例1 将DX.AX中的数据左移一位
SHL AL,1//要记得指定移动的位数!
RCL DX,1
//例2 把AL最低位送入BL最低位,保持AL不变
ror bl,1
ror al,1
rcl bl,1
rol al,1
//例3 将一个32位数据循环左移四位
.model tiny
.code
.startup
mov ax,word ptr ddvar
mov dx,word ptr ddvar+2
mov cl,4
mov bh,dh
mov bl,ah
shl dx,cl
shl ax,cl
shr bh,cl
shr,bl,cl
or dl,bl
or al,bh
.exit 0
ddvar dd 12ab56cdh
end
一组数据求和、最大、最小值
求和问题若涉及到多字节,需要考虑进位的影响。并且熟悉有进位加法adc的使用。
//例1 两个双字无符号数求和
.model tiny
.code
.startup
mov ax,word ptr num1//先处理低16位
add ax,word ptr num2
mov word ptr sum,ax
mov ax,word ptr num1+2//再处理高16位
adc ax,word ptr num2+2
mov word ptr sum+2,ax
mov dx,0
rcl dl,1
mov fsum,dl//保存高16位的进位结果
.exit 0
num1 dd 82348567H
num2 dd 87658321H
sum dd ?
fsum dd ?
end
对一组数据进行操作,有时也需要用到循环结构
//例2 对1-100的数求和
.model tiny
.code
.startup
mov cx,100
xor ax,ax
again: add ax,cx //由于1-100相加,正与CX的值相符
loop again
mov sum,ax
.exit 0
sum dw ?
.end
寻找一组数据中的最大、最小值
//例3 寻找数据段中10个16位二进制数的最大值存放于MAX中
.model tiny
.code
.startup
mov bx,offset buffer
mov cx,10//默认10进制
mov ax,[bx]
rotate:
inc bx
inc bx
cmp ax,[bx]
jge next//有符号比较greater or equal
mov ax,[bx]
next:
loop rotate
mov max,ax
.exit 0
buffer dw
max dw ?
.end
数据显示(以16、10、2进制显示数据)
//例1 8位二进制数转化为ASCII码显示
.model tiny
.code
.startup
mov al,hex
mov bx,offset ASCII
and al,0fh//只有低4位有效
xlat//何方神圣???
mov dl,al
mov ah,2//2号字符显示功能
int 21h
.exit 0
ASCII db 30h,31h,...,39h
ASCII 41h,...46h
hex db 0bh
.end
若不限定显示的进制,直接调用9号功能,则BX中存储的值被直接作为ASCII码,对照ASCII码做出显示。因此,要以特定的进制显示,则要先将数值转化为对应的ASCII码。
//把BX中的数以十六进制的形式显示在屏幕上
.model tiny
.code
.startup
mov ch,4//决定循环次数
rotate: mov cl,4//4位二进制代表一位16进制
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit//判断是否为数字
add al,7h//非数字则再加7转化为字母
printit:
mov dl,al//待显示字符存入dl中
mov ah,2//2号字符显示功能
int 21h
dec ch//循环次数
jnz rotate
.exit 0
.end
字符串处理(查找、比较、替换等)
字符串的比较需要用到串操作的相关指令
//例1 比较两长度相同的字符串是否完全相同
.model tiny
.code
.startup
**mov si,offset string1**//字符串源操作数si
mov di,offset string2//目的操作数di
mov cx,count
**cld**//令DF=0,复位;std则令DF=1
**repz cmpsb//**较两字符串,即将两字符串相减
jnz unmat//若结果非0,则不相同
mov al,0
jmp output
unmat:
mov al,ffh
output:
move result,al
.exit0
string1 db ''
string2 db ''
count equ $-string2
.end
字符串查找
//从一个字符串中查找指定字符T
.model tiny
.code
.startup
lea di,string
mov al,'T'
mov cx,count
**repne scasb**
jnz over
mov char,al
dec di
mov caddr,di
over:
.exit 0
string db ''
count equ $-string
char db 0ffh
caddr dw ?
.end
数据输入(字符串输入和进一步处理)
字符串输入考察中断功能的调用和缓冲区的定义
buffer db 81//可能输入的最大字符数
db 0
db 81 dup(0)
mov dx,offset buffer
mov ah,0ah
int21h