3.3ss-sp寄存器,栈的push,pop指令_哔哩哔哩_bilibili
3.6条件判断语句cmp,je,ja,jb及adc、sbb指令_哔哩哔哩_bilibili
5.3用栈翻转数组,动态规划求斐波那契数列_哔哩哔哩_bilibili
这章主要是逻辑运算,栈和跳转语句的问题。逻辑运算的没找到,栈的讲解视频在上面。前两个为栈和跳转基础知识,最后一个为栈的程序设计。
JE相等跳转
JNE不相等跳转
JB低于跳
JNB不低于跳
JA高于跳
JNA不高于跳
跳转直接记表。
压栈和弹栈都是一次两个字节。
先进后出=后进先出
65-90对应 A-Z 97-122对应 a-z 差32=20H
pop:SP+2(先访问再+2)
PUSH :SP-2(先-2再访问)
push cx把cx存在到栈中,pop dx将刚存的数取出来给dx
设CX=1234H DX=5678H执行后 CX=1234H DX=1234H
0024H 0026H 0028H 002AH
bd是1个字节,cx是两个字节
没什么好说的。
不管CC是啥条件,只要是条件跳转都是满足就跳,不满足就继续执行
有跳转了
CMP不改变寄存器的值
pop:SP+2(先访问再+2)
PUSH :SP-2(先-2再访问)
从键盘输入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序。
没有用栈,有的内存变量。ascii最大就127 AL够了
DATA SEGMENT
X DB 4 DUP("$")
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,1 ;01指令输入一个字符存入al
INT 21H
CMP AL,0DH ;判断是不是回车,如果是就退出
JE EXIT
MOV BL,AL
MOV BH,10 ;Al存是16进制,要转换为10进制
MOV CX,3 ;跟输出110一样的步骤
MOV SI,2
REPEAT1:
MOV AH,0
MOV X[SI],AH ;重置为000 防止上次的结果影响这次
DIV BH ;AX/BH=AL......AH
ADD AH,48
MOV X[SI],AH
DEC SI
LOOP REPEAT1
MOV DX,OFFSET X
MOV AH,9
INT 21H
JMP START
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
数据段定义如下:
DATAS SEGMENT
DA1 DW -5,2,-1,0,4,100 DUP( 10)
COUNT = ($-DA1)/2
DATAS ENDS
编写程序,统计变量DA1中正数的个数,并将其在屏幕上输出。
要求:
-
统计结果利用除10取余法转换为10进制数据输出;
-
利用堆栈存储余数的ASCII码;
DATAS SEGMENT
DA1 DW -5, 2, -1, 0, 4, 100 DUP(10)
COUNT = ($ - DA1) / 2
DATAS ENDS
STACKS SEGMENT
DB 10 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS, SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX, STACKS
MOV SS, AX
MOV SP,20
MOV CX,COUNT
MOV SI,0
A:
CMP DA1[SI], 0
JLE B
INC BX
B: ADD SI, 2
LOOP A
MOV CX,3
MOV AX,BX ;总数给bx
MOV DL,10
MOV BX,0
REPEAT1:
MOV AH,0
DIV DL ;AX/DL=AL......AH
ADD AH,48
MOV BL,AH
PUSH BX
LOOP REPEAT1
MOV CX,3
REPEAT2:
POP DX
MOV AH,02
INT 21H
LOOP REPEAT2
MOV AH,4CH
INT 21H
CODES ENDS
END START