汇编语言复习笔记——编程题

因为此次复习主要是针对考试范围进行的,因此,将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
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值