博主是个大笨比,只会阿巴阿巴阿巴
题目:
编写程序段,将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 也可以