己知列表为 a=l1,2,3,4,5,66,77,88,99,34,21,37,69],提取列表a所有奇数元素,构成新列表b
时间: 2023-08-13 15:04:32 浏览: 72
可以使用列表推导式来提取列表a中的所有奇数元素,并构造新列表b,具体实现如下:
```python
a = [1, 2, 3, 4, 5, 66, 77, 88, 99, 34, 21, 37, 69]
b = [x for x in a if x % 2 == 1]
print(b) # [1, 3, 5, 77, 99, 21, 37, 69]
```
以上代码中,`if x % 2 == 1` 是筛选条件,只有当元素为奇数时,才会被添加到新列表b中。
相关问题
串口设置为方式0,要在4个数码管上显示信息(从右至左),只须通过51单片机串口依次发送4个信息的字段码。在下面程序中,编程实现在4个数码管上滚动显示16个十六进制符号0~F。 ORG 0000H ;显示缓冲区为50H~53H单元 LJMP MAIN ORG 0100H MAIN: MOV SCON,#00H ;串口初始化方式0 START:MOV R3,#0 ;需显示的字符 K1: MOV R4,#4 ;改变显示缓冲区值 MOV R1,#50H MOV A,R3 K0: MOV @R1,A INC R1 DJNZ R4,K0 ACALL DISPLAY ;调用串口发送显示程序 ACALL DELAY ;延时 INC R3 CJNE R3,#16,K1 SJMP START ;延时子程序 DELAY:MOV R7,#05 L2: MOV R6,#0FFH L1: MOV R5,#0FFH L0: DJNZ R5,L0 DJNZ R6,L1 DJNZ R7,L2 RET DISPLAY:MOV R0,#50H ;51单片机串口发送显示程序 MOV R2,#4 L3: MOV A,@R0 INC R0 ADD A,#0AH ;调整距离段选码表首的偏移量 MOVC A,@A+PC ;查表取得字段码 MOV SBUF,A ;51单片机串口发送 L4: JNB TI,L4 ;等待发送 CLR TI DJNZ R2,L3 RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH ; 0~F共阳极数码管字段码 END 请参考上述内容回答下列问题: 51单片机串行口扩展并行输出口连接一个七段数码管。试编程实现数码管循环显示数字0-9,每个数字显示时间为1s(用定时器实现)。
以下是实现该功能的基本代码:
```
ORG 0000H
MOV TMOD, #01H ; 设置定时器0为模式1
MOV TH0, #3CH ; 定时1ms
MOV TL0, #0B0H
SETB TR0 ; 启动定时器0
MOV P1, #0 ; 初始化P1口为低电平
LJMP MAIN
ORG 000BH
CLR TR0 ; 关闭定时器0
MOV TH0, #3CH ; 重新设置定时器0初值
MOV TL0, #0B0H
SETB TR0 ; 启动定时器0
MOV A, P1 ; 读取P1口状态
CPL A ; 取反
MOV P1, A ; 刷新P1口输出
RET
ORG 0100H
MAIN:
MOV P1, #00H ; 初始化P1口为低电平
MOV SCON, #50H ; 串口方式1,波特率9600
MOV TH1, #FDH ; 波特率9600,定时器初值
MOV TL1, #FDH
SETB TR1 ; 启动定时器1
LOOP:
MOV R2, #10 ; 显示10个数字
MOV R1, #0 ; 数字初始化为0
DISPLAY:
MOV A, R1 ; 将数字转为段选码
ANL A, #0FH
ADD A, #TAB
MOV R0, A ; 保存段选码
CALL SEND ; 发送段选码
MOV A, #100B ; 设置P1口为高电平
MOV P1, A
CALL DELAY ; 延时1s
MOV A, #000B ; 设置P1口为低电平
MOV P1, A
INC R1 ; 数字加1
DJNZ R2, DISPLAY ; 循环显示10个数字
SJMP LOOP ; 无限循环
SEND:
MOV SBUF, R0 ; 发送段选码
WAIT:
JNB TI, WAIT ; 等待发送完毕
CLR TI
RET
DELAY:
MOV R7, #39 ; 延时1s
MOV R6, #200
MOV R5, #200
DELAY_LOOP:
DJNZ R5, DELAY_LOOP
DJNZ R6, DELAY_LOOP
DJNZ R7, DELAY_LOOP
RET
TAB:
DB 3FH ; 0的段选码
DB 06H ; 1的段选码
DB 5BH ; 2的段选码
DB 4FH ; 3的段选码
DB 66H ; 4的段选码
DB 6DH ; 5的段选码
DB 7DH ; 6的段选码
DB 07H ; 7的段选码
DB 7FH ; 8的段选码
DB 6FH ; 9的段选码
END
```
代码的思路是利用定时器0定时1s,定时完毕后改变P1口状态,从而控制七段数码管的亮灭。同时,通过调用SEND函数发送段选码,实现数字在七段数码管上的显示。循环显示0-9数字的过程在主程序LOOP中实现。
S0 SEGMENT STACK DW 20 DUP(?) TOP LABEL WORD S0 ENDS S1 SEGMENT TIP DB "Please enter ten numbers separated by spaces:", 0DH, 0AH, 24H ARY DW 20 DUP(0) CRLF DB 0DH, 0AH, 24H N DW 0 S1 ENDS S2 SEGMENT ASSUME SS:S0, DS:S1, CS:S2, ES:S1 P PROC FAR MOV AX, S0 MOV SS, AX LEA SP, TOP MOV AX, S1 MOV DS, AX MOV AX, S1 MOV ES, AX LEA DX, TIP MOV AH, 9 INT 21H LEA SI, ARY XOR DX, DX MOV BL, 10 MOV CX, 10 INPUT: MOV AH, 1 INT 21H CMP AL, 20H ;空格分隔字符 JE SAVE;输入十进制数,将数存入SI对应的内存单元 MOV DL, AL MOV AX, [SI] MUL BL SUB DL, 30H ADD AL, DL MOV [SI], AX JMP INPUT SAVE: ADD SI, 2 LOOP INPUT;数组保存完毕 LEA SI, ARY MOV DI, SI ADD DI, 2 ;DI位于数组的第二元素的位置 MOV BP, 9 ;SI移动的次数和每一次比较的次数,第一次为9 GO: MOV CX, BP ;每一次比较的循环次数 MOV BX, [SI] ;第一个数 CMPA: CMP BX, [DI] ;比较后面的数是否比当前的小 JBE CON ;大于就比较下一个 MOV BX, [DI] ;将寄存器中的值替换为最小的值 MOV AX, DI ;AX存放最小值的偏移地址 CON: ADD DI, 2 LOOP CMPA CMP AX, 0 ;如果AX为0,则表示后面的值没有比当前值小 JE NO ;此时SI加一,移动到第二个数 下一次循环比较开始 CHANGE: MOV DX, [SI] ;78-83行替换当前值与最小值 PUSH DX MOV [SI], BX POP DX MOV DI, AX MOV [DI], DX NO: ADD SI, 2 MOV DI, SI ADD DI, 2 CALL PRINT DEC BP ;循环的次数减一 XOR AX, AX ;清除AX的内容,以便76行判断 CMP BP, 1 JNE GO EXIT: MOV AH, 4CH INT 21H P ENDP PRINT PROC NEAR PUSH SI PUSH CX PUSH AX PUSH DX LEA DX, CRLF MOV AH, 9 INT 21H LEA SI, ARY MOV CX, 10 L1: MOV AX, [SI] MOV N, AX CALL OUTPUT ADD SI, 2 MOV DX, 20H MOV AH, 2 INT 21H LOOP L1 POP DX POP AX POP CX POP SI RET PRINT ENDP OUTPUT PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX XOR CX, CX MOV AX, N MOV BX, 10 L2: XOR DX, DX DIV BX PUSH DX INC CX CMP AX, 0 JNE L2 L3: POP DX ADD DX, 30H MOV AH, 2 INT 21H LOOP L3 POP DX POP CX POP BX POP AX RET OUTPUT ENDP S2 ENDS END P一共123行每行都是干什么的
这是一段汇编语言代码,用于对输入的十个数字进行排序并输出。下面是每行的功能:
- 第1-5行:定义堆栈区域S0,用于存储程序的堆栈信息;定义数据区域S1,用于存储程序的变量和常量;定义代码区域S2,用于存储程序的指令。
- 第6行:将SS寄存器(堆栈段)设置为S0区域的起始地址。
- 第7行:将SP寄存器(堆栈指针)设置为堆栈区域的顶部(TOP)。
- 第8-10行:将DS寄存器(数据段)和ES寄存器(附加数据段)设置为S1区域的起始地址。
- 第11-15行:显示提示信息。
- 第16-18行:定义一个数组ARY,用于存储输入的十个数字;定义一个计数器N,用于记录已经输入的数字个数。
- 第19行:定义一个换行符CRLF。
- 第20行:定义一个变量BP,用于记录每次循环需要比较的次数。
- 第21-22行:定义程序入口点P。
- 第23-24行:将AX寄存器设置为堆栈段的起始地址,并将SS寄存器设置为AX的值,相当于将堆栈段的起始地址赋给SS寄存器。
- 第25行:将堆栈指针设置为堆栈顶部。
- 第26-27行:将DS和ES寄存器设置为S1区域的起始地址。
- 第28-32行:显示提示信息。
- 第33行:将SI寄存器(源变址寄存器)设置为数组ARY的起始地址。
- 第34-35行:将DX寄存器清零。
- 第36行:将BL寄存器设置为10,用于将输入的字符转换为十进制数。
- 第37-38行:将CX寄存器设置为10,用于记录还需要输入多少个数字。
- 第39-41行:输入一个字符并将其保存在AL寄存器中。
- 第42-43行:如果输入的是空格分隔字符,则跳转到SAVE标签保存输入的数字。
- 第44-49行:将输入的字符转换为十进制数,并将其存储在SI对应的内存单元中。
- 第50行:跳转到INPUT标签继续输入下一个字符。
- 第51-52行:将SI寄存器加2,指向下一个空闲的内存单元,并将CX计数器减1。
- 第53行:如果CX计数器不为零,则跳转到INPUT标签继续输入下一个数字。
- 第54-55行:将SI寄存器设置为数组ARY的起始地址。
- 第56-57行:将DI寄存器(目的变址寄存器)设置为数组ARY的第二个元素的位置。
- 第58行:将BP寄存器设置为9,表示需要进行9轮排序。
- 第59行:跳转到GO标签开始排序。
- 第60行:将CX寄存器设置为BP,即每轮需要比较的次数。
- 第61行:将BX寄存器设置为当前需要比较的数字,即SI指向的数字。
- 第62-63行:比较DI指向的数字是否小于BX,如果是,则跳转到CON标签。
- 第64-65行:将DI指向的数字赋值给BX寄存器,作为当前最小的数字。
- 第66-67行:将AX寄存器设置为DI的值,即当前最小数字的偏移量。
- 第68行:跳转到CON标签。
- 第69行:将DI寄存器加2,指向下一个数字。
- 第70行:将CX计数器减1。
- 第71行:如果CX计数器不为零,则跳转到CMPA标签继续比较下一个数字。
- 第72-73行:如果AX寄存器为零,则表示后面的数字都不比当前数字小,跳转到NO标签。
- 第74行:将SI寄存器加2,指向下一个数字。
- 第75行:将DI寄存器重新设置为数组ARY的第二个元素的位置。
- 第76行:调用PRINT子过程输出当前排完序的数组。
- 第77行:将BP计数器减1。
- 第78行:如果BP计数器不为1,则跳转到GO标签继续排序下一轮。
- 第79-81行:将AH寄存器设置为4CH,即程序结束的系统调用。
- 第82行:调用INT 21H中断,结束程序。
- 第83行:定义PRINT子过程,用于输出数组中的数字。
- 第84-85行:将SI寄存器设置为数组ARY的起始地址。
- 第86-87行:将CX寄存器设置为10,即数组中有10个数字需要输出。
- 第88-89行:循环输出数组中的每个数字。
- 第90-93行:将当前数字存储在N变量中,并调用OUTPUT子过程输出它。
- 第94-97行:将SI寄存器加2,指向下一个数字,并输出一个空格。
- 第98-99行:如果CX计数器不为零,则跳转到L1标签继续输出下一个数字。
- 第100-104行:恢复寄存器的值,并返回到调用它的位置。
- 第105行:定义OUTPUT子过程,用于将十进制数转换为字符串并输出。
- 第106-109行:保存现场。
- 第110-111行:将CX计数器清零。
- 第112-113行:将AX寄存器设置为要转换的数字。
- 第114-115行:将BX寄存器设置为10,用于取余和除法运算。
- 第116-117行:循环取余并将其压入堆栈中,同时将CX计数器加1。
- 第118-119行:如果AX寄存器不为零,则跳转到L3标签继续取余。
- 第120-121行:循环从堆栈中取出数字并输出。
- 第122-123行:恢复现场并返回到调用它的位置。
- 第124行:结束程序。
阅读全文