新手求教汇编语言程序,超级简单,但是我就是不会写,头疼死了

新手求教汇编语言程序,超级简单,但是我就是不会写,头疼死了,第1张

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

明天晚上要上机实验微机原理,如果我做不出来那程序,那就完蛋了。虽然说是超级简单,但是对于我一个新学者,并且是电脑文盲来说,艰巨性还是可以想象的。

题目要求是:(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编程环境)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存