ASSUME DS:seg1, CS:seg2
seg1 SEGMENT
first DB 5,-8,3,9,-2,-5,7,-9,0,5,4,9,-6,1,-1,8,-3,6,2,-7,0,-4
LEN_first EQU $ - first
second DB 30 DUP()
seg1 ENDS
seg2 SEGMENT
start:
MOV AX, seg1
MOV DS, AX
;--------------------------下面是复制
;2复制
;将first行中的非负数复制到second行
MOV SI, 0
MOV DI, 0
MOV CX, LEN_first
LOP:
MOV AL, first [SI]
CMP AL, 80H
JNB NEXT
MOV second [DI], AL
INC DI
NEXT:
INC SI
LOOP LOP
;--------------------------下面是排序
;3排序
;将second行中的数据按升序重新排列。
MOV CX, DI
DEC CX
LP1:
PUSH CX
MOV SI, 0
LP2:
MOV AL, second [SI]
CMP AL, second [SI + 1]
JB NEXT2
XCHG AL, second [SI + 1]
MOV second [SI], AL
NEXT2:
INC SI
LOOP LP2
POP CX
LOOP LP1
;--------------------------下面是结束程序
EXIT:
MOV AH, 4CH
INT 21H
seg2 ENDS
END start
DATA SEGMENT
INPUT DB 'INPUT A DIGIT : $'
ENTER DB 0DH , 0AH , '$'
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE , DS:DATA , SS:STACK
START :
MOV AX , DATA
MOV DS , AX
MOV AH , 9
LEA DX , INPUT
INT 21H
MOV AH , 1
INT 21H
LEA DX , ENTER
MOV AH , 9
INT 21H
CMP AL ,BYTE PTR 0
JBE BELOW
MOV DL , '1'
JMP EXIT
BELOW :
MOV DL , AL
EXIT :
MOV AH , 2
INT 21H
MOV AH , 1
INT 21
MOV AH , 4CH
INT 21H
CODE ENDS
END START
;A题:
;判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,则结束程序,若为其它字符则不显示,继续等待新的字符输入。
data segment
DB 0
data ends
code segment
assume cs:code,ds:data
main proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
next:
mov ah,07
int 21h
cmp al,0dh
jE end_d
cmp al,'0'
JGE DY0 ;>=0
JMP NEXT ;<'0'30H
DY0:
CMP AL,'9'
JLE IS_09
CMP AL, 'A'
JGE DY_A ;DAYU A
JMP NEXT ;<'A'41H
DY_A:
CMP AL,'Z'
JLE IS_AZ
CMP AL,'a'
JGE DY_xA ;DAYU xA
JMP NEXT ;<'a'61H
DY_xA:
CMP AL,'z'
JLE IS_AZ
JMP NEXT
;
IS_AZ:
MOV AH,02
MOV DL,'c'
INT 21H
JMP NEXT
IS_09:
MOV AH,2
MOV DL,AL
INT 21H
JMP NEXT
end_d:
ret
main endp
code ends
end main
;=============================================================
;B题:
data_C segment
DATA DB -1 , 4, 9 ;该处3数值可任意设定
A1 DB 0
A2 DB 0
A3 DB 0
DISP_MESS DB 0DH,0AH,'MIN IS : '
D1 DB 0
D2 DB 0, 'H$'
data_C ends
code segment
assume cs:code,ds:data_C
main proc far
push ds
sub ax,ax
push ax
mov ax,data_C
mov ds,ax
MOV BX, OFFSET DATA
MOV AL,[BX]
INC BX
MOV AH,[BX]
CMP AL,AH
JL ALAL1 ;AL<AH
XCHG AH,AL
ALAL1:
INC BX
MOV DL,[BX]
CMP AL ,DL
JL ALAL
XCHG AL,DL
ALAL:
CMP AH,DL
JL AL_SMALL
XCHG AH,DL
AL_SMALL:
MOV A1,DL
MOV A2,AH
MOV A3, AL
XOR DL,AL ;最大和最小数异或
AND DL,80H
NOT DL
TEST DL,80H ;高位为1 表示一正一负,否则为全负或全正
JE YZYF
AND AL,80H
NOT AL
TEST AL,80H ;高位为1 表示全负
JE QF
MOV AH,02
MOV DL,'+'
INT 21H
JMP DISP_SMALL
QF:
MOV AH,02
MOV DL,'-'
INT 21H
JMP DISP_SMALL
YZYF:
MOV AH,02
MOV DL,''
INT 21H
DISP_SMALL: ;显示最小值
MOV AL,A3
MOV AH,AL
AND AX,0F00FH
MOV CL,4
SHR AH,CL
CMP AH,0AH
JGE IS_AZ
ADD AH,30H
MOV D1,AH
JMP NN_1
IS_AZ:
ADD AH,40H -0AH+1
MOV D1,AH
NN_1:
CMP AL,0AH
JGE IS_AZ1
ADD AL,30H
MOV D2,AL
JMP NN_2
IS_AZ1:
ADD AL,40H -0AH+1
MOV D2,AL
NN_2:
MOV AH,09
MOV DX,OFFSET DISP_MESS
INT 21H
ret
main endp
code ends
end main
ASSUME CS:CODESG, DS:DATA
DATA SEGMENT
ARRY1 DB 34H,37H,6EH,0C2H,55H,16H,9FH
LEN EQU $ - ARRY1
RES1 DB LEN DUP(0)
DATA ENDS
CODESG SEGMENT
START:
MOV AX, DATA
MOV DS, AX
MOV SI, 0
;==========================
MOV CX, LEN
LP1:
MOV AL, ARRY1[SI]
PUSH CX
;----------------------
MOV CX, 8
LP2:
ADD AL, AL
JNC N1
INC BYTE PTR RES1[SI]
N1:
LOOP LP2
;----------------------
POP CX
INC SI
LOOP LP1
;==========================
MOV AX, 4C00H
INT 21H
CODESG ENDS
END START
汇编语言程序设计步骤:
1、分析问题,抽象出描述问题的数据模型
2、确定问题的算法思想
3、画出流程图或结构图
4、分配存储器和工作单元(寄存器)
5、逐条编写程序
6、静态检查,上机调试例:编程查找考生的最高分,假设所有考生分数已存入计算机内存
1、分析问题根据条件、特点、规律→数学模型本例分数已给定为0~200之间的整数集合(考虑加试分),记为{S},找max{S}(注:简单问题不一定写数学模型)
2、确定算法思想最好利用现成算法和程序设计方法,若无,则需根据实践经验总结算法思想
如本例,从成绩单第一分数往下看,边看边比较,记住较高分,舍弃较低分,直至看完,最高分存于脑中
归纳算法思想:建立数据指针并指向数据区首地址
将第一数取入寄存器(如AL),与下一数比较,若下一数大则将其取入寄存器,否则调整指针,再与下一数比较,重复上述过程,直至比较完毕,寄存器中即最高分
读分数用MOV指令,比较用CMP指令,分析判断用条件转移指令
3、画流程图或结构图有逻辑流程、算法流程、程序流程等,复杂问题需画模块结构
本例简单,只画出程序流程图(用模块化结构的N-S流程图表示):本例的N-S流程图图中初始化包括:设一个计数器,将分数个数减一后送计数器,每比较一次减一,至零查找结束;建立一个指针指向数据区
开始初始化取第一数到寄存器与下一数比较下一数大?是否取大数到寄存器修改指针,计数次数减一返回到循环体开始,直到计数次数为0退出循环结束
4、分配存储器空间和工作单元(寄存器)定义数据段、堆栈段、代码段等
工作单元一般用寄存器
本例:分数放数据段,建100字节堆栈空间,BX作数据指针,CX作计数器,AL放最高分
5、逐条编写程序DATASEGMENTFENDB85,90,60,75,87,35,80,78,96,82;存分数MAXDB;存最高分DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP();100字节堆栈STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARPUSHDSMOVAX,0PUSHAX;为了返回DOSMOVAX,DATAMOVDS,AX;置数据段寄存器MOVBX,OFFSETFEN;置数据指针MOVCX,MAX-FEN;置计数器初值DECCX;N个分数比较N-1次MOVAL,[BX];取第一个分数LOP:INCBX;调整指针CMPAL,[BX];与下一数比较JAENEXT;大于等于则转MOVAL,[BX];否则取下一数NEXT:LOOPLOP;计数器减一,;不为零转LOPMOVMAX,AL;存放最高分RET;返回DOSSTARTENDPCODEENDSENDSTART6、静态检查,上机调试选用指令尽量字节少,使其执行速度快
易错处应重点查,如比较次数、转移条件等
确信无错后方可上机调试
以上就是关于关于汇编语言分支与循环程序的问题全部的内容,包括:关于汇编语言分支与循环程序的问题、如何用汇编语言写一个判断分支程序:由用户输入一个数字,如果输入的数字大于等于0则将数字转化为1.、汇编语言。循环与分支程序设计。高手们进来帮下忙吧~ 谢啦~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)