1、
AL=55H,BL=55H,CL=55H
55H = 0101 0101
1.XOR AL,0FH
AL与0FH做异或运算即
0101 0101和
0000 1111做异或运算
结果AL=0101 1010
2.SHL AL,1
AL逻辑左移1位,即二进制位左移1位,右边补零
结果AL=1011 0100
3.AND BL,0FH
BL与0FH做与运算即
0101 0101和
0000 1111做与运算
结果BL=0000 0101
4.TEST BL,0F0H
BL与0FH做与运算,但是最后结果不会赋给BL,只会对PSW寄存器产生影响,所以这一步不会让BL产生任何变化
5.OR CL,0FH
CL与0FH做或运算即
0101 0101和
0000 1111做或运算
结果CL=0101 1111
6.INC CL
CL自加1
结果CL=0110 0000
7.HLT
停止程序
所以执行完后,
AL=1011 0100即B4H
BL=0000 0101即05H
CL=0110 0000即60H
2、
1.MOV SP,2000H
SP为栈顶的偏移地址,设置为2000H
2.MOV AX,3000H
为AX赋值为3000H
3.MOV BX,1234H
为BX赋值为1234H
4.PUSH BX
压入BX,SP-2
5.PUSH AX
压入AX,SP-2
6.POP BX
弹出栈顶数据并赋值给BX,SP+2
7.HLT
停止程序
分析见图
所以执行完后
SP=1FFEH
AX=3000H
BX=3000H
3、
MOV AH,0
MOV CX,8
AGAIN:
SHL AL,1
JC ADD1
JMP NEXT
ADD1:
INC AH
NEXT:
LOOP AGAIN
HLT
1.分析功能
MOV AH,0
,MOV CX,8
都是赋值操作- AGAIN部分做了
- AL逻辑左移1位,最高位移入CF,最低位补零
- JC指令,当CF=1时跳转到ADD1
- JMP指令,跳转到NEXT
- ADD1只做了AH自增1这件事
- NEXT只做了
LOOP AGAIN
这件事,LOOP指令,CX-1,如果CX不等于0则跳转到AGAIN
- 首先对循环条件进行分析,由于CX=8,所以LOOP会执行7次,加上第一次运行,也就是整个程序只会运行8次
- 然后依次看跳转条件,
JC ADD1
,就是判断CF是否为1,在之前对CF进行改变的程序只有SHL AL,1
,也就是CF会被置为执行此操作前AL的最高位,当为1时通过JC ADD1
跳转到ADD1,然后AH+1,若为1则不进入ADD1,也就是AH不变,然后直接跳转到NEXT进行下一次循环 - 所以可以判断出,程序就是在统计AL寄存器中1的个数,然后存入AH中
2.执行程序
执行前AL=36H,即0011 0110
根据之前的分析,只需要把1的个数统计出来然后存入AH中,切记AL在逻辑左移8次后变为了0000
所以AX=0000 01000 0000 0000,即40H
4、
- 功能分析
- 判断BL的值与0的关系,去对DL设相应的值
- 思路:使用CMP 去比较两个数的大小,然后配合跳转给DL设值
CMP BL,0
JZ ZERO
JS NEGATIVE
JMP POSITIVE
ZERO:
MOV DL,0
JMP OVER
POSITIVE:
MOV DL,1
JMP OVER
NEGATIVE:
MOV DL,-1
JMP OVER
OVER:
HLT
简写
MOV DL,0
CMP BL,0
JZ OVER
JS NEGATIVE
INC DL
JMP OVER
NEGATIVE:
DEC DL
OVER:
HLT
1、
1.
计数初值为 1MHZ/100HZ = 10000 = 2710H
2.
控制字为0011 0110
3.
MOV AL,36H
OUT 43H,AL
MOV AL,10H
OUT 40H,AL
MOV AL,27H
OUT 40H,AL
2、
1.
控制字为1001 0000
2.
INIT:
MOV AL,90H
OUT 63H,AL
START:
MOV AL,80H
OUT 61H,AL
JMP MAIN
ERROR:
MOV AL,01H
OUT 62H,AL
MAIN:
IN AL,60H
XOR AL,FFH
JNZ ERROR
MOV AL,00H
OUT 62H,AL
JMP MAIN