用汇编语言编下列两题,高分!急求!!

用汇编语言编下列两题,高分!急求!!,第1张

1、7个评委分别给出10~20之间的整数分,去掉一个最高和最低分,剩余5个求平均分。要求:评委给出两位的十进制数从键盘输入,最后得分以十进制输出显示在屏幕,设计显示格式。

本程序通过编译,运行正确

Code Segment

Assume CS:Code,DS:Code

CR EQU 000DH

LF EQU 000AH

KBBack EQU 0008H

-----------------------------------------

功能:输出一个字符

入口:dl=要显示的字符

enter_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

enter_Chr endp

-----------------------------------------

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

入口:

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

用法: Output Str_Addr

用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

-----------------------------------------

功能:取光标位置

入口:无

出口:DH=行号,DL=列号

GetCursor Proc Near

PUSH AX

PUSH BX

PUSH CX

XOR BX,BX

MOV AH,3

INT 10H

MOV Cursor_Row,DH

MOV Cursor_Col,DL

POP CX

POP BX

POP AX

RET

Cursor_Row DB ?

Cursor_Col DB ?

GetCursor EndP

-----------------------------------------

功能:置光标位置

入口:Cursor_Row=行坐标Cursor_Col: 列坐标)

SetCursor Proc Near

PUSH CX

PUSH BX

PUSH AX

MOV DH,Cursor_Row

MOV DL,Cursor_Col

XOR BX,BX

MOV AH,2

INT 10H

POP AX

POP BX

POP CX

RET

SetCursor EndP

-----------------------------------------

功能:输出回车换行

enter_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

enter_CTLF endp

-----------------------------------------

功能:键盘输入一个N位的十进制数字,

用逻辑和移位指令将其转换成二进制数并保存在指定的内存单元。

入口:N=数字位数;di=保存输入的数字首地址

出口:转换后的二进制数保存在di所指的单元

Input_Digit Proc Near

push dx

push cx

push bx

push di

lea di,@@Save_Tmp

push di

cld

mov cx,N

push cx

@@Input: call GetCursor 取光标位置

mov ah,1 从键盘接受一个字符

int 21h

cmp al,CR 若键入的是回车,已经键入的数字不足N位

jz @@ASC_Dec 转去处理已经键入的数字

cmp al,KBBack

jz @@KB_Back 若是回空键,重新输入

cmp al,'0'

jb @@KBBack 若低于数字'0',重新输入

cmp al,'9'

ja @@KBBack 若低于数字'9',重新输入

jmp @@Save_Dig

@@KB_Back: dec Cursor_Col

inc cx

dec di

@@KBBack: call SetCursor 置光标位置

jmp @@Input

@@Save_Dig: and al,0fh 转换成二进制数

stosb 保存

loop @@Input 接受下一个数字

@@ASC_Dec: mov ax,cx

pop cx

pop si

sub cx,ax 实际输入的数字位数

xor dx,dx

xor ax,ax

jcxz @@Save_Ret 若直接回车,没有输入任何数字,按输入'0'处理

dec cx 实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数

mov bl,10

@@Mul_Ten: lodsb

cbw

add ax,dx

mul bl

mov dx,ax

loop @@Mul_Ten

lodsb

cbw

add ax,dx

@@Save_Ret: pop di

stosb

pop bx

pop cx

pop dx

ret

@@Save_Tmp db 16 dup(?)

Input_Digit EndP

-----------------------------------------

功能:把AL中的二进制无符号数转换成显式的十进制ASCII

入口:AL=二进制数;di=转换后的ASCII保存地址

出口:无

Dec_ASCII Proc Near

push si

push cx

push bx

push di

mov bl,10

xor cx,cx

lea di,@@Temp_Save[3]

cld

@@Divide: xor ah,ah

div bl

or ah,30h

mov [di],ah

dec di

inc cx

test al,0ffh

jnz @@Divide

push di

pop si

inc si

pop di

pop bx

push di

rep movsb

pop di

pop cx

pop si

ret

@@Temp_Save db 4 dup(?)

Dec_ASCII EndP

-----------------------------------------

Teachers equ 7 评委人数

N equ 2 评委打分位数

Grades db Teachers dup(?) 7位评委给出的分数

Most_Grade dw ? 最高分

Least_Grade dw ? 最低分

PromptStr DB 'Please input ',Teachers or 30h,' grades: $'

Max_One db 'The maximum grade: '

Most_Str db 4 dup('$')

Mix_One db 'The miximum grade: '

Least_Str db 4 dup('$')

Last_Grade db 'The last everage grade: '

Last_Str db 4 dup('$')

Start: push cs

pop ds

push cs

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

7个评委分别给出10~20之间的整数分

Output PromptStr 提示评委亮分

lea di,Grades 分数存放地址

mov cx,Teachers 评委数

push cx

push di

Input_Number:

call enter_CTLF 输出一个回车、换行

call Input_Digit 从键盘输入一位评委的打分

loop Input_Number 下一个评委的打分

pop si

pop cx

dec cx

lodsb

mov ah,al ah=最低分,al=最高分

Compare: cmp ah,[si] 当前最低分与当前分比较

jbe $+4 若低于或等于,转去比较最高分

mov ah,[si] 当前最低分高于当前分,保存新的最低分

cmp al,[si] 当前最高分与当前分比较

jae $+5 若高于或等于,转去与下一个分数比较

lodsb 当前最高分低于当前分,保存新的最高分

jmp $+3 转去与下一个分数比较

inc si 数组下标增1

loop Compare 循环

mov byte ptr Most_Grade,al 保存最高分

mov byte ptr Least_Grade,ah 保存最低分

call enter_CTLF 输出一个回车、换行

call enter_CTLF 输出一个回车、换行

call enter_CTLF

lea di,Most_Str

call Dec_ASCII 把最高分转换成ASCII码

Output Max_One 显示一个最高分

call enter_CTLF 输出一个回车、换行

lea di,Least_Str

mov al,byte ptr Least_Grade 取最低分

call Dec_ASCII 把最低分转换成ASCII码

Output Mix_One 显示一个最低分

call enter_CTLF 输出一个回车、换行

call enter_CTLF

lea si,Grades 分数存放地址

mov cx,Teachers-1 评委数-1

xor ah,ah

lodsb

mov dx,ax 总分初值

Addition: lodsb

add dx,ax 累加各评委分数

loop Addition

去掉一个最高分和最低分

sub dx,Most_Grade 去掉一个最高分

sub dx,Least_Grade 去掉一个最低分

剩余5个求平均分

mov ax,dx

mov bx,Teachers-2

div bl 平均分取整数部分

最后得分以十进制输出显示在屏幕

lea di,Last_Str

call Dec_ASCII 把平均分转换成ASCII码

Output Last_Grade 显示平均分

Exit_Proc: mov ah,4ch 结束程序

int 21h

Code ENDS

END Start 编译到此结束

2、设-8<=A<=8,-12<=B<=12,-15<=C<=15

求出A+B+C=0的全部解

给定条件的三个变量,共有13175个组合,满足A+B+C=0的有400个。

本程序通过编译,运行正确

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

-----------------------------------------

功能:把AL中的二进制有符号数转换成显式的十进制ASCII码

入口:AL=二进制数;di=转换后的ASCII保存地址

出口:无

Dec_ASCII Proc Near

push si

push cx

push bx

push di

mov bl,10

xor cx,cx

lea di,@@Temp_Save[3]

cld

push ax

test al,80h

jz @@Divide

neg al

@@Divide: xor ah,ah

div bl

or ah,30h

mov [di],ah

dec di

inc cx

test al,0ffh

jnz @@Divide

pop ax

mov byte ptr [di],' '

test al,80h

jz $+5

mov byte ptr [di],'-'

dec di

inc cx

push di

pop si

inc si

pop di

pop bx

push di

rep movsb

pop di

pop cx

pop si

ret

@@Temp_Save db 4 dup(?)

Dec_ASCII EndP

-----------------------------------------

功能:向指定的内存地址写3个空格

入口:di=指定的内存地址

出口:无

Out_Space Proc Near

push di

push cx

push ax

mov al,20h

mov cx,3

cld

rep stosb

pop ax

pop cx

pop di

ret

Out_Space EndP

-----------------------------------------

A0 equ -8 变量A初值

B0 equ -12 变量B初值

C0 equ -15 变量C初值

ABC_Number db 3 dup(?)

Count dw 0 A+B+C=0的全部解计数

PromptStr DB 'A+B+C=0',13,10,13,10,'$'

Sum_Zero db 'A='

A_Number db 3 dup(20h)

db ', B='

B_Number db 3 dup(20h)

db ', C='

C_Number db 3 dup(20h),13,10,'$'

设-8<=A<=8,-12<=B<=12,-15<=C<=15,求出A+B+C=0的全部解

Start: push cs

pop ds

push cs

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

Output PromptStr

lea si,ABC_Number

mov cx,17

mov byte ptr [si],A0

A_Var: push cx

mov cx,25

mov byte ptr [si][1],B0

B_Var: push cx

mov cx,31

mov byte ptr [si][2],C0

C_Var: push cx

mov al,[si]

add al,[si][1]

adc al,[si][2]

cmp al,0

jnz Next_One

lea di,A_Number

call Out_Space

mov al,[si]

call Dec_ASCII 把变量A的值转换成显式的十进制ASCII码

lea di,B_Number

call Out_Space

mov al,[si][1]

call Dec_ASCII 把变量B的值转换成显式的十进制ASCII码

lea di,C_Number

call Out_Space

mov al,[si][2]

call Dec_ASCII 把变量C的值转换成显式的十进制ASCII码

Output Sum_Zero

inc Count 计数

Next_One: inc byte ptr [si][2]

pop cx

loop C_Var

pop cx

inc byte ptr [si][1]

loop B_Var

pop cx

inc byte ptr [si]

loop A_Var

Exit_Proc: mov ah,4ch 结束程序

int 21h

Code ENDS

END Start 编译到此结束

(1)

用最新病毒库杀毒。

通常的刷新可能是因为。你的后台有程序运行。

可能存在冲突导致Explorer.EXE这个自动退出。然后重新启动

自然就会刷新

病毒或者你装得其他软件存在问题。

然后

右键 我的电脑 =>属性 =>高级 选项卡

在性能那点设置 =>数据执行保护 选择"除所选之外................."单选框,然后在添加Windows Explorer进去就行了 c:\windows\explorer.exe

(2)

开始,运行 gpedit.msc,计算机配置,管理模板,系统,windows文件保护,

在右边窗口中双击windows文件保护扫描,进入设置标签,选择已禁用

2种解决办法 不行的话只有重装系统了


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

原文地址:https://54852.com/yw/11458763.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存