用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