用汇编语言编循环结构程序

用汇编语言编循环结构程序,第1张

        DATA  SEGMENT

         BUF  DB        11H,22H,33H,44H,55H,66H,77H,88H

           N  DB        $-BUF

         MIN  DB        

         MAX  DB        

        DATA  ENDS

        CODE  SEGMENT

              ASSUME    CS:CODE,DS:DATA

      START:

              MOV       AX,SEG DATA

              MOV       DS,AX

              MOV       DL,N

              XOR       DH,DH

              ; 以下通过排序将最大置于首、最小置于尾              

              DEC       DX

         L1:

              MOV       CX,DX

              MOV       SI,OFFSET BUF

         L2:

              MOV       AL,[SI+1]

              CMP       AL,[SI]

              JG        NEXT

              XCHG      AL,[SI]

              MOV       [SI+1],AL

       NEXT:

              INC       SI

              LOOP      L2

              DEC       DX

              JNZ       L1

              MOV       SI,OFFSET BUF

              MOV       AL,[SI]

              MOV       MIN,AL

              MOV       AL,[SI+N-1]

              MOV       MAX,AL

              MOV       AH,4CH

              INT       21H

        CODE  ENDS

              END       START

1将80C51片内RAM的20H~2EH共15个单元置以初值0A0H~0AEH,

mov r0,#20H

mov a,#0a0h

loop:

mov @r0,a

inc r0

inc a

cjne r0,#2fh,loop

然后再将8700H~870EH单元的内容传送到片内RAM的60H~6EH中。

mov dptr,#8700h

mov r0,#60h

loop2:

movx a,@dptr

mov @r0,a

inc dptr

inc r0

mov a,dpl

cjne a,#0fh,loop2

最后将20H~2EH单元的内容传送到片外RAM的8700H~870EH

mov dptr,#8700h

mov r0,#20h

loop3:

mov a,@r0

movx @dptr,a

inc dptr

inc r0

cjne r0,#2fh,loop3

end

2用P1口的p10-p17八个端口做输出口,接8只发光二极管(LED),编写程序使LED循环点亮。

mov a,#1

loop:

rl a

mov p1,a

;delay

mov r1,#0ffh

loop2:mov r2,#0ffh

djnz r2,$

djnz r1,loop2

;delay end

sjmp loop

end

3题目: P1口接8只发光二极管(L0~L7), T1作定时器,系统晶振6MHz。编写程序,让第1秒时L0~L3点亮, L4~L7暗;第2秒时L0~L3暗, L4~L7亮;第3秒时L0~L7全亮;第4秒时L0~L7全暗;第5秒时L0~L3点亮, L4~L7暗;如此循环下去

;这个有点复杂了……

org 0h

sjmp start

org 0bh

mov th0,#0bh

mov tl0,#0dch

inc r7;R7是计数器,满8次表示1秒到了

cjne r7,#8,exit

mov r7,#0

inc r6

cjne r6,#4,skip

mov r6,#0

skip:

mov a,r6

movc a,@a+dptr

mov p1,a

exit:reti

start:

mov tmod,#1

setb ea

setb et0

setb tr0

mov dptr,#tab

sjmp $

tab:db 0f0h,0fh,0h,0ffh

;Copyright:wangtianxu

;File name:rankasm

;Description:建立学生名次表rank

STACK1 SEGMENT

DW 32 DUP('S')

STACK1 ENDS

DATA SEGMENT

GRADE DW 89,90,60,57,78,83,96,99,73,89 ;数组

RANK DW 10 DUP() ;预留空间

CN DW ($-RANK)/2 ;元素个数

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK1

MAIN PROC FAR

START:

MOV AX,DATA

mov DS,AX

MOV CX,10;设置循环次数为10

MOV BX,0;BX存放当前被处理的数据在数组中的索引值,初始化为0

CYCLE: ;外层循环起始

PUSH CX;保存循环计数(下面的POP CX用来恢复这个记数)

MOV AX,GRADE[BX];取出第BX个学生的成绩

MOV DX,0;存放当前处理的学生的名次,初始化为0

LEA SI,GRADE;取数组的起始片仪偏移值

MOV CX,10

NEXT:;内层循环

CMP AX,[SI];AX与[SI]比较

JG NOCOUNT;如果AX大,则跳过INC DX

INC DX;AX不大于DS:[SI],则DX自增一次

NOCOUNT:

ADD SI,2;使SI加2,以便指向下一个被比较的对象

LOOP NEXT;内层循环,CX不为0则跳到NEXT

MOV RANK[BX],DX;DX是第BX个学生的排名

POP CX;恢复外层循环的次数

ADD BX,2;指向下一个被处理的学生的成绩

LOOP CYCLE;外循环

MOV AH,4CH

INT 21H

MAIN ENDP

CODE ENDS

END START

参考的C语言代码(译成汇编与上面的代码不全相同,但是算法一样的)里面的变量为了和上面的汇编比较,都是用寄存器名命名的,但是请注意还是有许多区别,不要弄混了。

int grade[10] = {88,75,95,63,98,78,87,73,90,60};

int rank[10];

void main()

{

int ax,si,bx=0,dx;

int cx;//循环计数。为了模拟上面的CX,这里就只用一个变量cx。

int temp;

for(cx = 10;cx != 0; cx--)

{

temp = cx;

ax = grade[bx];

si = 0;

for(cx = 10;cx != 0; cx--) //内层循环,cx应该被初始化为10,这样ax才能和所有的学生比较

{

if(ax<=grade[si]) //和自己比较时相等,满足,故dx自加1,这样循环结束时dx就是“比自己成绩高的人数+1”了,也就是名次。

dx++;

si += 1;

}

rank[bx] = dx;

bx += 1;

cx = temp;

}

}

mov cx,10

A:

loop A

;此时会执行A中的内容(CX)次,即10次~

;再同理

mov cx,10

B:

loop B

如果你要循环嵌套的话,需要用 "cmp" "jg" "jl"等

实验5 编写、调试具有多个段的程序

-----------------------------------------

(1)

1保持不变

2<考虑不同机子环境不同,答案无法统一>

3X-2,X-1

(2)

1保持不变

2<考虑不同机子环境不同,答案无法统一>

3X-2,X-1

4(N/16+1)16 [说明:N/16只取整数部分]

(3)

1保持不变

2<考虑不同机子环境不同,答案无法统一>

3X+3,X+4

(4)

答:第3个仍然可以正确执行。因为如果把end指令后的标号start去掉后,编译器便会顺序执行程序。换句话说:当未给编译器预先的通知,要求其从哪开始执行程序时,编译器就自动以'至上向下'的顺序进行编译执行源程序。

(5)完整程序如下:

assume cs:code

a segment

db 1,2,3,4,5,6,7,8

a ends

b segment

db 1,2,3,4,5,6,7,8

b ends

c segment

db 0,0,0,0,0,0,0,0

c ends

code segment

start:mov ax,a

mov es,ax

mov ax,c

mov ds,ax

mov bx,0

mov cx,8

s1:mov ax,es:[bx]

add [bx],ax

add bx,2

loop s1

mov ax,b

mov es,ax

mov ds,ax

mov bx,0

mov cx,8

s2:mov ax,es:[bx]

add [bx],ax

add bx,2

loop s2

mov ax,4c00h

int 21h

code ends

end start

(6)完整程序如下:

assume cs:code

a segment

dw 1,2,3,4,5,6,7,8

a ends

b segment

dw 0,0,0,0,0,0,0,0

b ends

code segment

start:

mov ax,b

mov ss,ax

mov sp,10h

mov ax,a

mov ds,ax

mov bx,0

mov cx,8

s: push [bx]

add bx,2

loop s

mov ax,4c00h

int 21h

code ends

end start

实验6 实践课程中的程序

-------------------------------

(2)编程:完成问题中的程序。

问题79完整程序如下:

assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment

dw 0,0,0,0,0,0,0,0

stacksg ends

datasg segment

db '1 display '

db '2 brows '

db '3 replace '

db '4 modify '

datasg ends

codesg segment

start:

mov ax,stacksg

mov ss,ax

mov sp,16

mov ax,datasg

mov ds,ax

mov bx,0

mov cx,4

s: ;外循环

push cx

mov si,3

mov cx,4

s0: ;内循环

mov al,[bx+si]

and al,11011111b

mov [bx+si],al

inc si

loop s0

add bx,16

pop cx

loop s

mov ax,4c00h

int 21h

codesg ends

end start

以上就是关于用汇编语言编循环结构程序全部的内容,包括:用汇编语言编循环结构程序、单片机汇编实验、汇编语言设计,急!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存