关于汇编语言分支与循环程序的问题

关于汇编语言分支与循环程序的问题,第1张

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.、汇编语言。循环与分支程序设计。高手们进来帮下忙吧~ 谢啦~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10137694.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存