1. 首页 > 科技

用8086汇编语言编程? 汇编语言8086

用8086汇编语言编程?汇编语言8086

用8086汇编语言编程

;X86汇编_求0-9立方,显示结果

; MASM5.0编译后,运行无误

code segment

assume cs:code,ds:code

100h

start:

push cs

pop ds

Again:lea dx,Tips1

mov ah,9

int 21h ;显示提示

@In:mov ah,0

int 16h ;无回显输入

cmp al,1bh ;Esc退出程序

jz quit

cmp al,'0'

jb @Err

cmp al,'9';数据校验

jbe Q2

@Err:

mov ah,0eh

int 10h

lea dx,Err

jmp Q3

Q2:

mov X,al

sub al,'0'

mov dl,al

mul al

mul dl

lea si,Y

lea di,Z

mov cx,3

Q4:xor dx,dx

div word ptr [di]

or al,'0'

mov [si],al

inc si

inc di

inc di

mov ax,dx

loop Q4

lea dx,Result

Q3:

mov ah,9

int 21h

jmp Again

quit:

mov ah,4ch

int 21h

Err db 0dh,0ah,'INPUT ERROR!$'

Tips1 db 0dh,0ah,'Input(0-9),Esc to Quit: $'

Result db ' '

X db '0^3='

Y db '000$'

z dw 100,10,1

code ends

end start

使用8086汇编语言编写程序

; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。

Code Segment

Assume CS:Code,DS:Code

; -------------------------------------

; 功能:显示指定地址(Str_Addr)的字符串

; 入口:

; Str_Addr=字符串地址(要求在数据段)

; 用法: Output Str_Addr

; 用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

; -------------------------------------

; 功能:输出一个字符

; 入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Output_Chr Endp

; -------------------------------------

; 功能:输出回车换行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF Endp

; -------------------------------------

; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

; 入口:AX=二进制数

; 出口:在当前光标位置显示转换后的ASCII码数字

Dec_ASCII Proc Near

push ds

push cs

pop ds

push cs

pop es

push dx

push bx

push di

mov bx,10

lea di,@@Temp_Save[6]

mov BYTE ptr [di],'$'

dec di

cld

@@Divide: xor dx,dx

div bx

or dl,30h

mov [di],dl

dec di

test ax,0ffffh

jnz @@Divide

inc di

push di

pop dx

mov ah,9

int 21h

pop di

pop bx

pop dx

pop ds

ret

@@Temp_Save db 7 dup(?)

Dec_ASCII EndP

; -------------------------------------

; 功能:把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码,

; 并送显示屏显示,未考虑四舍五入

; 入口:AH=二进制数,BH=除数,CX=保留小数位数

; 出口:在当前光标位置显示转换后的ASCII码数字

Dec_Frac Proc Near

push ax

mov dl,'.'

call Output_Chr ;显示一个小数点

pop ax

mov bl,10 ;乘数

@@Dec_Frac: mov al,ah ;余数不为0,处理小数部分

mul bl ;余数乘10,继续做除法

div bh ;除以除数,取商数作为结果的一位小数

or al,30h

mov dl,al

call Output_Chr ;显示一位小数

loop @@Dec_Frac

ret

Dec_Frac EndP

; -------------------------------------

SCORE db 76,69,84,90,73,88,99,63,100,80 ; 成绩单

Elements equ ($-SCORE)/Type SCORE ;元素个数

RESULT db 6 dup(0) ; 各分数段计数

prompt_Res db '00---59: $'

prompt_100 db '----100: $'

Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'

Start: push cs

pop ds

push cs

pop es ;使数据段、附加段与代码段同段

; -------------------------------------

; 统计低于60分,60~69分,70~79分,80~89分,90~99分和100分各分数段人数并显示

lea si,SCORE ; 成绩首地址

mov cx,Elements ;成绩数目

mov dl,10 ; 用于除10

cld

@@Statics: lodsb ; 提取成绩

xor ah,ah

div dl ; 除10

cmp al,5 ; >5,及格

jg $+4

mov al,5 ; <=5,不及格

sub al,5 ; 减5,分数段计数地址偏移量

cbw ;

push ax

pop bx

inc RESULT[bx] ; 计数增1

loop @@Statics ; 循环,统计下一个成绩

mov bl,59h

mov cx,5

lea si,RESULT ;各分数段计数数组首地址

lea dx,prompt_Res ; 统计结果字符串地址List_Res: mov ah,9 ;显示分数段提示信息

int 21h

lodsb ;读入计数值

xor ah,ah

call Dec_ASCII ; 显示统计结果

call Output_CTLF ;输出一个回车、换行

mov al,bl

inc al

daa

mov bl,al

push cx

mov cl,4

xor ah,ah

shl ax,cl

shr al,cl

or ax,3030h

xchg ah,al

mov WORD ptr Prompt_Res,ax

mov al,bl

add al,9

mov bl,al

xor ah,ah

shl ax,cl

shr al,cl

or ax,3030h

xchg ah,al

mov WORD ptr Prompt_Res[5],ax

pop cx

loop List_Res

Output prompt_100 ;提示显示100分的人数

lodsb ;读入100分计数值

xor ah,ah

call Dec_ASCII ; 显示统计结果

; -------------------------------------

Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch ;结束程序

int 21h

Code ENDS

END Start ;编译到此结束

如何用汇编语言(8086)实现这2个简单程序?

1。 在内存BUFF单元中定义有10个16位数,试寻找其中的最大、最小值并分别放到指定的单元MAX和MIN中。

SSEG SEGMENT STACK

STK DB 20 DUP(?)

SSEG ENDS

DSEG SEGMENT

BUFF DW -5,56,45,-96,5,2,457,8,7,-8

MAX DW ?

MIN DW ?

DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG,SS:SSEG

START: MOV AX,DSEG

MOV DS,AX

LEA BX,BUFF

MOV CX,10

MOV AX,[BX]

MOV MIN,AX

MOV MAX,AX

INC BX

DEC CX

AGAIN: MOV AX,[BX]

CMP AX,MIN

JE NEXT

JA A1

MOV MIN,AX

JMP NEXT

A1: CMP AX,MAX

JB NEXT

MOV MAX,AX

NEXT: INC BX

DEC CX

JNZ AGAIN

MOV AH,4CH

INT 21H

CSEG ENDS

END START

2。在BUFF开始的存储区中存放30个带符号数,试统计起正数、负数、零的个数,并将个数分别放到A1、A2、A3单元中。

SSEG SEGMENT STACK

STK DB 20 DUP(?)

SSEG ENDS

DSEG SEGMENT

BUFF DB ………………;省略掉

A1 DB ? ;正数

A2 DB ? ;负数

A3 DB ? ;零;

DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG,SS:SSEG

START: MOV AX,DSEG

MOV DS,AX

LEA BX,BUFF

MOV DI,30

MOV CX,0

MOV DL,0

L1: MOV AL,[BX]

CMP AL,0

JE L2

JG L3

INC CL

JMP NEXT

L2: INC DL

JMP NEXT

L3: INC CH

NEXT: INC BX

DEC DI

JNZ L1

MOV A1,CH

MOV A2,CL

MOV A3,DL

MOV AH,4CH

INT 21H

CSEG ENDS

END START

请问用8086汇编语言编写程序计算1+2+……+100 怎么写??求代码,谢谢

展开全部

DSEG SEGMENT

RESULT DW 0

DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG

START:

MOV AX,DSEG

MOV DS,AX

;

XOR AX,AX

MOV CX,100

C1:

ADD AX,CX

LOOP C1

;

MOV RESULT,AX

;

MOV AX,4C00H

INT 21H

CSEG ENDS

END START