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保持不变
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
以上就是关于用汇编语言编循环结构程序全部的内容,包括:用汇编语言编循环结构程序、单片机汇编实验、汇编语言设计,急!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)