每天一到汇编题(1)

博主是个大笨比,只会阿巴阿巴阿巴

题目:

编写程序段,将AX寄存器中的内容以相反的顺序传送到DX寄存器中,并要求AX中的内容不被破坏,然后统计DX中寄存器里‘1’的个数并存入寄存器BL中.

从题中提炼出的要点:
1.DX中的内容 是 AX的内容倒过来的内容
2.AX值不被破坏
3.统计DX中的 1的个数 存到 BL 中

方式一:(先左移再右移)

Data segment
Data ends

Stack segment
Stack ends

Code segment
	assume CS:Code,DS:Data,SS:Stack
Start:
	MOV AX,Data
	MOV DS,AX
	;关键程序段
	;=============================================================================
	MOV DX,0 ;清空DX -> `保存AX倒过来的值`
	MOV BL,0 ;清空BL -> `计数1的个数`
	PUSH AX  ;AX内容压入栈中保存-> `AX的内容不被破坏`
	MOV CX,16;循环次数定义为16次 正好一个16位寄存器的大小
loop_to_left:
	SHL AX,1;逻辑左移(算数左移)
	JNC right;判断CF的值,若CF=0则跳转至right
	INC BL  ;BL自增
right:
	RCR DX,1;循环右移
	Loop loop_to_left
stop:
	RCR DX,1;循环右移
	PUSH AX
	;=============================================================================	
	MOV AH,4CH
	INT 21H
Code ENDS
END Start
	

内容倒叙的思路:(通过将 原内容左移 进入CF , CF右移到目的地址 来回去原内容的倒叙)
1.将原内容使用SHL向左移位,通过JNC(判断CF是否等于0)来决定是否让BL进行自加的操作
2.将CF的值通过RCR循环右移入最高位完成倒序

方式二(右移再右移)

Data segment
Data ends

Stack segment
Stack ends

Code segment
	assume CS:Code,DS:Data,SS:Stack
Start:
	MOV AX,Data
	MOV DS,AX
	;关键程序段
	;=============================================================================
	MOV DX,0 ;清空DX -> `保存AX倒过来的值`
	MOV BL,0 ;清空BL -> `计数1的个数`
	PUSH AX  ;AX内容压入栈中保存-> `AX的内容不被破坏`
	MOV CX,16;循环次数定义为16次 正好一个16位寄存器的大小
loop_to_right:
	SHR AX,1;逻辑右移
	JNC right;判断CF的值,若CF=0则跳转至right
	INC BL  ;BL自增
right:
	RCR DX,1;循环右移
	Loop loop_to_right
stop:
	PUSH AX
	;=============================================================================	
	MOV AH,4CH
	INT 21H
Code ENDS
END Start

tip :这里的JNC 换为 JNB 也可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值