分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
明天晚上要上机实验微机原理,如果我做不出来那程序,那就完蛋了。虽然说是超级简单,但是对于我一个新学者,并且是电脑文盲来说,艰巨性还是可以想象的。
题目要求是:(1)单子节无符号数排序:DATANUM单元开始存放双字节无符号数,表示要排序数据的个数;DATAS单元开始存放要排序的数据,数据格式至少10个,程序运行之后,这些数据按照由小到大的顺序仍然存放于DATAS单元开始的位置‘
(2)去极值滤波:某控制系统为了抗干扰,采用去极值滤波法处理采集数据,采集数据所用A/D转换器精度为12位,取连续6个A/D采样值(双字节,低12位),要求去掉最大值和最小值,将余下的4个数求平均值,用该平均值代表当前时刻系统状态的真值。试编一程序完成这一滤波过程。
以上算法我也懂,但是刚学微机,指令什么的都不知道该如何用。各位好手,麻烦帮帮忙,帮我编写以上两个小程序,最好的给出注释。先给200,满意的追100
解析:
你等我
DATANUM=10 ;设有10个数据
STACK SEGMENMT STACK ‘STACK’
DW 100H DUP()
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
DATABUF DW DATANUM
DB DATANUM DUP(?)
DATA EDATANUMDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
; 取出随机数据
MOV CX,DATABUF
LEA SI,DATABUF+2
MOV BL,23
MOV AL,11
LP:
MOV [SI],AL
INC SI
ADD AL,BL
LOOP LP
; 数据排序
MOV CX,DATABUF
DEC CX
LEA SI,DATABUF+2
ADD SI,CX
LP1:
PUSH CX
PUSH SI
LP2:
MOV AL,[SI]
CMP AL,[SI-1]
JAE NOXCHG
XCHG AL,[SI-1]
MOV [SI],AL
NOXCHG:
DEC SI
LOOP LP2
POP SI
POP CX
LOOP LP1
;数据排序结束
MOV AH,4CH ;返回DOS
MOV AL,0
IDATANUMT 21H
CODE ENDS
END START
我这个连中断都用上了
第二题
PUSH PSW ;保护现场
PUSH A
CLR C ;进位标志位清零
MOV DATA,DATA2
MOV A,DATA1
SUBB A,DATA ;求Yn-1 -Yn
JNC COMPARE ;如果Yn-1 -Yn≥0,转COMPARE
CPL A ;如果Yn-1 -Yn<0, 求补
INC A
COMPARE: CLR C
SUBB A,LIMIT ;│Yn-Yn-1│和△y比较
JC OVER ;如果│Yn-Yn-1│≤△y,DATA2→DATA
MOV DATA,DATA1 ;如果│Yn-Yn-1│>△y,DATA1→DATA
OVER: POP A ;恢复现场
POP PSW
RET ;返回
这个作为参考,是MCS的
;入口 :A,SDAT,DELTY
;占用资源:B
;堆栈需求:2字节
;出口 :A
JUGFILT :MOV B,A
CLR C
SUBB A,SDAT
JNC JUGFT1
CPL A
INC A
JUGFT1 :SETB A
SUBB A,#DELTY
JNC JUGFT3
MOV A,SDAT
RET
JUGFT3 :MOV A,B
MOV SDAT,A
RET
;中位值滤波程序
;入口 :ADDPH,ADDPL,N
;占用资源:ESELSORT
;堆栈需求:4字节
;出口 :A
MEDFILT :LCALL ESELSORT
MOV A,N
CLR C
RRC A
ADD A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
JNC MEDFT1
INC DPH
MEDFT1 :MOVX A,@DPTR
RET
;N点算术平均滤波
;入口 :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
AVFILT :MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR A
MOV R3,A
MOV R4,A
MOV R7,N
AVFT1 :MOVX A,@DPTR
INC DPTR
ADD A,R4
MOV R4,A
JNC AVFT2
INC R3
AVFT2 :DJNZ R7,AVFT1
MOV R7,N
MOV R2,#00H
LCALL NDIV31
MOV A,R4
RET
;N点加权平均滤波
;入口 :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
QAVFILT :CLR A
MOV R3,A
MOV R4,A
MOV R7,N
MOV P2,ADDPH
MOV R1,ADDPL
MOV DPTR,#QAVTAB
QAVFT1 :MOVC A,@A+DPTR
MOV B,A
MOVX A,@R1
INC DPTR
INC R1
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
DJNZ R7,QAVFT1
MOV A,R4
JNB ACC7,QAVFT2
INC R3
QAVFT2 :MOV A,R3
RET
QAVTAB :DB
;一阶加权滞后滤波程序
;入口 :A,DELTY
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
BQFILT :MOV B,A
CLR A
MOV DPTR,#ABTAB
MOVC A,A+DPTR
MUL AB
MOV R4,A
MOV R3,B
MOV A,01H
MOVC A,A+DPTR
MOV B,DELTY
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
MOV A,R4
JNB ACC7,FT1
INC R3
FT1 :MOV A,R3
MOV DELTY,A
RET
BQTAB :DB 80H,80H
键盘输入一个字符串,然后换行将字符串显示出来:
code segment
assume cs:code
org 100h
start:jmp begin
buffer db 254,0,254 dup('$')
; 字符串缓冲区,首字节为串的最大长度,第2字节为串的实际长度
; 第3字节开始存放字符串(其实串长度应小于254,最后一个留给$
; 以便调用9号功能调用输出)
begin: push cs
pop ds
push cs
pop es ;将数据段和附加数据段均指向代码段
lea dx,buffer ;取字符串缓冲区首地址到dx
mov ah,10 ;10功能调用,从键盘输入字符串
int 21h
mov ah,2
mov dl,13 ;回车
int 21h
mov dl,10 ;换行
int 21h
lea dx,buffer ;取串缓冲区首地址
add dx,2 ;加2后指向输入的字符串的第1个字符
mov ah,9 ;9号功能调用,输出以$为结尾符的字符串
int 21h
mov ah,4ch ; 返回dos
int 21h
code ends
end start
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP,#60H ;堆栈,本程序也可不要
MOV 30H,#56H ;求5678H+1234H
MOV 31H,#78H
MOV 32H,#12H
MOV 33H,#34H
MOV A,31H
ADD A,33H
MOV R2,A ;低8位在R2
MOV A,30H
ADDC A,32H
MOV R1,A ;高8位在R1
MOV R3,#10H ;30H至40H共10H个字节
MOV R0,#30H ;间接寻址模式起始地址为30H
CLR A
LOOP: MOV @R0,A
INC R0
DJNZ R3,LOOP
HERE: JMP HERE ;结束原地循环
END
DATA SEGMENT
MESS DB 0DH,0AH,'Please input (0-9): $'
MESS1 DB 0DH,0AH, 'Sort ====>>>>: '
BUF1 DB 20 dup('$')
MESS2 DB 0DH,0AH,'Max & Min ====>>>>: '
MAX DB 0,' & '
MIN DB 0,'$'
CC DB 0 ;输入的字符数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MESS
INT 21H
MOV CX,0
MOV BX,OFFSET BUF1
AGAIN:
MOV AH,7
INT 21H
CMP AL,0DH
JE BE_CR
CMP AL,'0'
JB AGAIN
CMP AL,'9'
JA AGAIN
MOV DL,AL
MOV AH,2
INT 21H
MOV [BX],DL
INC CX
CMP CX,20
JAE BE_CR
INC BX
JMP AGAIN
BE_CR:
MOV CC,CL
MOV AX,CX
CMP AX,0
JNE L1
JMP EXIT
L1:
;排序
MOV BX,OFFSET BUF1
PUSH CX
L2:
MOV AL,[BX]
CMP AL,[BX+1]
JA NO_EX
PUSH AX ;交换数据
PUSH [BX+1]
POP AX
MOV [BX],AL
POP AX
MOV [BX+1],AL
NO_EX:
INC BX
LOOP L2
POP CX
LOOP L1
MOV AL, BUF1
MOV MAX,AL
MOV BX,OFFSET BUF1
XOR AX,AX
MOV AL,CC
ADD BX,AX
MOV AL,[BX-1]
MOV MIN,AL
MOV DX,OFFSET MESS1
MOV AH,9
INT 21H
MOV DX,OFFSET MESS2
MOV AH,9
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
;
ORG 0000H
AJMP START
ORG 0100H
START:
MOV 42H, #88H ;先设NA<NB
MOV A, 40H
CJNE A, 50H, LOOP1 ;NAH-NBH
SJMP NEXT ;相等则再去比较低八位
LOOP1:
JC LOOP ;不够减,就可以结束了
AJMP LOOP3 ;转
NEXT:
MOV A, 41H
CJNE A, 51H, LOOP2 ;NAL-NBL
LOOP2:
JC LOOP ;不够减,就可以结束了
LOOP3:
MOV 42H, #0FFH ;否则就是NA>=NB
LOOP:
AJMP LOOP
END
8086汇编语言,使用masm5汇编器编译通过
data segment
score db 30,40,50,60,70,80,90,67,70 ;9个学生的分数
num_under60 db 0 ;60以下的人数
num_60to69 db 0 ;60到69的人数
num_70to79 db 0 ;70到79的人数
num_80to89 db 0 ;80到89的人数
num_90to99 db 0 ;90到99的人数
num_100 db 0 ;100的人数
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
xor ax,ax
mov cx,9 ;循环9次
lea bx,score
compare:
cmp byte ptr [bx],60 ;与60比较
jl under60
jmp is60to69
is60to69:
cmp byte ptr [bx],70 ;与70比较
jl _60to69
jmp is70to79
is70to79:
cmp byte ptr [bx],80 ;与80比较
jl _70to79
jmp is80to89
is80to89:
cmp byte ptr [bx],90 ;与90比较
jl _80to89
jmp is90to99
is90to99:
cmp byte ptr [bx],100 ;与100比较
jl _90to99
jz equal100
under60: ;如果低于60
add num_under60,1
jmp con
_60to69: ;如果在60到69之间
add num_60to69,1
jmp con
_70to79: ;如果在70到79之间
add num_70to79,1
jmp con
_80to89: ;如果在80到89之间
add num_80to89,1
jmp con
_90to99: ;如果在90到99之间
add num_90to99,1
jmp con
equal100: ;如果等于100
add num_100,1
con:
lea bx,[bx+1]
loop compare
last: ;输出
mov dl,num_under60 ;输出60以下的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_60to69 ;输出60到69的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_70to79 ;输出70到79的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_80to89 ;输出80到89的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_90to99 ;输出90到99的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_100 ;输出100的人数
add dl,30h
mov ah,2
int 21h
mov ah,4ch ;返回DOS
int 21h
code ends
end start
代码如下:
; 显示三角形data SEGMENT
ORG 100H
STAR DB ' ', '$'
SPACE DB ' ', '$' ;空格
LINE DB 0DH, 0AH, '$' ;换行
data ENDS
stack SEGMENT PARA STACK
DW 256 DUP()
stack ENDS
code SEGMENT
ASSUME CS: code, DS: data
BEGIN:
MOV AX, data
MOV DS, AX
MOV CX, 15
LOOP1:
PUSH CX
; 计算第 i 行前导空格数
DEC CX
JZ LABEL1
LOOP2:
; 前导空格
MOV DX, OFFSET SPACE
MOV AH, 09H
INT 21H
LOOP LOOP2
LABEL1:
POP AX
PUSH AX
; 计算第 i 行显示字符数
MOV CX, 15
SUB CX, AX
INC CX
LOOP3:
; 显示 号
MOV DX, OFFSET STAR
MOV AH, 09H
INT 21H
LOOP LOOP3
; 换行
MOV DX, OFFSET LINE
MOV AH, 09H
INT 21H
POP CX
LOOP LOOP1
EXIT:
MOV AH, 4CH
INT 21H
code ENDS
END BEGIN
运行结果:
以上就是关于新手求教汇编语言程序,超级简单,但是我就是不会写,头疼死了全部的内容,包括:新手求教汇编语言程序,超级简单,但是我就是不会写,头疼死了、求一个简单的汇编语言编程,考试用,整个程序,20行左右。最好有注解.8086 8088两种都、编写简单的8051汇编语言程序(用KEIL编程环境)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)