汇编语言程序求答案

汇编语言程序求答案,第1张

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

Code Segment

Assume CS:Code,DS:Code

CR equ 000DH

LF equ 000AH

KBBack equ 0008H

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

; 功能:显示指定地址(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

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

; 功能:取光标位置

; 入口:无

; 出口: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

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

; 功能:键盘输入一个指定位数的十进制数字,将其转换成二进制数并保存在指定的内存单元。

; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536

; 约定:直接回车,视为数字0

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

; @@Type_Data=保存的数据类型,B=字节类型,W=字类型。

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

Input_Digit Proc Near

push dx

push cx

push bx

push di

lea di,@@Save_Tmp

push di

cld

mov cl,@@Digits

xor ch,ch

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 bp,bp

xor dx,dx

xor ax,ax

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

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

jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数

mov bx,10

@@Mul_Ten: lodsb

cbw

add ax,bp

mul bx

mov bp,ax

loop @@Mul_Ten

@@One_Digit:lodsb

cbw

add ax,bp

@@Save_Ret: pop di

cmp @@Type_Data,'B' ;字节类型?

jz $+5

stosw

jmp $+3

stosb

pop bx

pop cx

pop dx

ret

@@Digits db ;十进制数字位数

@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型

@@Save_Tmp db 16 dup()

Input_Digit EndP

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

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

; 入口:AX=二进制数

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

Dec_ASCII Proc Near

push dx

push bx

push di

mov bx,10

lea di,@@Temp_Save[6]

mov byte ptr [di],'$'

dec di

@@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

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

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

Students equ 30 ;学生人数

Temp_Cursor dw ;输入分数时,当前分数光标位置

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

prompt_Str db 'Please input the scores: $'

prompt_Max db CR,LF,CR,LF,'Maximum: $' ;提示显示最高分

prompt_Min db CR,LF,'Minimum: $' ;提示显示最低分

prompt_Res db '00---59: $'

prompt_Ave db CR,LF,'Average: $' ;提示显示平均分

Press_Key db CR,LF,CR,LF,'Press any key to exit$'

Start: push cs

pop ds

push cs

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

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

; 1、输入成绩

Output prompt_Str ;提示输入成绩

mov @@Digits,3 ;十进制数字位数

mov @@Type_Data,'B' ;保存的数据类型。B=字节类型,W=字类型

lea di,List_Score ;成绩存放地址

mov cx,Students

Input_Score:call GetCursor ;取光标位置

mov dx,word ptr Cursor_Row

mov Temp_Cursor,dx ;保存当前光标位置

call Input_Digit ;输入成绩

cmp cx,1

je @@Next_0

mov dx,Temp_Cursor

add dh,3

mov Cursor_Row,dl

mov Cursor_Col,dh

call SetCursor ;置光标位置

mov dl,','

call Output_Chr ;显示一个字符

@@Next_0: loop Input_Score

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

; 2、求最高分、最低分并显示

cld

lea si,List_Score ;学生成绩存储区地址

lodsb ;将第一个元素读入AL

mov ah,al ;AH=最高分,AL=最低分

mov cx,Students-1

Compare: cmp al,[si] ;当前最低分与当前元素比较

jbe $+4 ;若小于或等于,不更新最低分,转去与最高分比较

mov al,[si] ;当前最低分大于当前元素,装入新的最低分

cmp ah,[si] ;当前最高分与当前元素比较

jae $+4 ;若大于或等于,不更新最高分

mov ah,[si] ;当前最高分小于当前元素,装入新的最高分

inc si ;增1,准备处理下一个分数

loop Compare

xchg ah,al

push ax

Output prompt_Max ;提示显示最高分

pop ax

push ax

xor ah,ah

call Dec_ASCII ;显示最高分

Output prompt_Min ;提示显示最低分

pop ax

xchg ah,al

xor ah,ah

call Dec_ASCII ;显示最低分

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

; 3、统计低于60分、60-69、70-79、80-89、90-100各个分数段人数并显示

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

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

lea si,List_Score

xor bx,bx ;总分初值

mov dl,10 ; 用于除10

mov cx,Students

@@Statics: lodsb ; 提取成绩

xor ah,ah

add bx,ax ;累计总分

div dl ; 除10

cmp al,5 ; >5,及格

ja $+4

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

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

cbw ;

push ax

pop di

inc Score_Tab[di] ; 计数

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

mov al,Score_Tab[5] ;取100分人数

add Score_Tab[4],al ;加到90-100分数段

push bx ;入栈保存总分

mov bl,59h

mov cx,5

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

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

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

; 4、计算并显示平均分

Output prompt_Ave ;提示显示平均分

mov bl,Students

pop ax ;总分出栈

div bl ;平均分取整数部分

mov bh,ah ;保存余数

xor ah,ah

call Dec_ASCII ;显示平均分

mov ah,bh ;余数

mov bh,bl ;除数

mov cx,2 ;保留小数位数

call Dec_Frac ;把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码

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

Output Press_Key

mov ah,1

int 21h

Exit_Proc: mov ah,4ch ;结束程序

int 21h

List_Score: ;学生成绩存储区

Code ENDS

END Start ;编译到此结束

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

Code Segment

Assume CS:Code,DS:Code

; 定义常量

Yes EQU 1

No EQU 0

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

; 定义结构类型

Bubb_Para Struc ; 冒泡排序法参数表

Carry DB No ; 是否带符号。Yes:有符号数;No:无符号数

Sort DB No ; 升序/降序。Yes:升序;No:降序

Arry_Addr DW ;数组地址

Arry_Type DB ;数组元素类型

Yes_No DB 73h,76h,7dh,7eh

Load DB 0ach,0adh

Comp DB 3ah,3bh

Exchange DB 86h,87h

Store DB 0aah,0abh

Bubb_Para EndS

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

; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。

; 子程序原型:对字节元素进行无符号升序排序。

; 入口:SI=冒泡排序法参数表地址

Bubbling Proc Near

PUSH AX

PUSH BX

PUSH CX

PUSH SI

PUSH DI

push ds

push es

; ------------------根据排序参数,修改排序指令

push cs

pop ds

push cs

pop es

LEA DI,@@Compare

MOV AL,[SIArry_Type]

DEC AL

PUSH AX

LEA BX,[SILoad]

XLAT

MOV [DI][2],AL

POP AX

PUSH AX

LEA BX,[SIComp]

XLAT

MOV [DI][3],AL

POP AX

PUSH AX

LEA BX,[SIExchange]

XLAT

MOV [DI][7],AL

POP AX

LEA BX,[SIStore]

XLAT

MOV [DI][9],AL

MOV AL,[SICarry]

SHL AL,1

OR AL,[SISort]

XOR AH,AH

LEA BX,[SIYes_No]

XLAT

MOV [DI][5],AL

; ------------------按要求排序

MOV SI,[SIArry_Addr] ;数组地址

pop es

pop ds

MOV CL,Buffer[1] ;字符串长度

XOR CH,CH

DEC CX ;外循环次数

CLD

@@Scanning: PUSH CX ;入栈保存外循环次数

PUSH SI ;入栈保存数组地址

@@Compare: PUSH SI

POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用

LODSB ;将当前数组元素读入累加器

CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较

JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素

XCHG AL,[SI] ;若大于,交换数组元素

STOSB ;保存数值较小者

@@NextOne: LOOP @@Compare ;处理下一个数组元素

POP SI ;数组地址出栈

POP CX ;外循环次数出栈

LOOP @@Scanning ;下一趟比较

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

POP DI

POP SI

POP CX

POP BX

POP AX

RET

Bubbling EndP

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

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

; 入口:

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

; 用法: Output Str_Addr

; 用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

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

; 功能:输出回车换行

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 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

ret

@@Temp_Save db 7 dup()

Dec_ASCII EndP

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

letter dw ;字母个数

dight dw ;数字个数

other dw ;其它字符个数

Prompt_Str db 'Please input a string: $'

letter_sum db 13,10,13,10,'LETER: $'

dight_sum db 13,10,'DIGIT: $'

other_sum db 13,10,'OTHER: $'

Parameters Bubb_Para <No,Yes,Offset Buffer,Type Buffer>

Start: push cs

pop ds

push cs

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

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

; 从键盘上连续输入一行字符(字符个数不超过100个,该字符串用回车符结束)

Output Prompt_Str ;提示输入一串字符

lea dx,Buffer ;输入字符串缓冲区地址

mov ah,0ah ;从键盘接收字符串

int 21h

lea si,Buffer[1] ;实际输入的字符数地址

lodsb ;读入实际输入的字符数

test al,0ffh

jz Exit_Proc

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

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

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

; 将这些字符按照ASCII码由小到大顺序排序并显示

cld ;清方向标志,使变址寄存器增值

lea si,Parameters ;冒泡排序法参数表地址

call Bubbling ;将这些字符按照ASCII码由小到大顺序排序

lea si,Buffer[1] ;实际输入的字符数地址

lodsb ;读入实际输入的字符数

xor ah,ah

mov bx,ax

mov byte ptr [bx][si],'$'

Output Buffer[2] ;显示排序后的字符串

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

; 按字母、数字、其它字符分类统计计数

lea si,Buffer[1] ;实际输入的字符数地址

lodsb ;读入实际输入的字符数

xor ah,ah

mov cx,ax ;实际输入的字符数送计数器

Compare: lodsb ;当前字符→AL

mov ah,al ;al→ah,用于判断

and ah,0dfh ;屏蔽第5位,按大写字母处理

cmp ah,'Z' ;当前字符>'Z'

ja Other_Chr ;大于,转去按其它字符处理

cmp ah,'A' ;当前字符<'A'

jb Digit0_9 ;小于,转去判断是否数字

inc letter ;字母计数

jmp Next_One

Digit0_9: cmp al,'9' ;当前字符>'9'

ja Other_Chr ;大于,转去按其它字符处理

cmp al,'0' ;当前字符<'0'

jb Other_Chr ;小于,转去按其它字符处理

inc dight ;数字计数

jmp Next_One

Other_Chr: inc other ;其它字符计数

Next_One: loop Compare

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

; 显示分类统计结果

Output letter_sum

mov ax,letter

call Dec_ASCII

Output dight_sum

mov ax,dight

call Dec_ASCII

Output other_sum

mov ax,other

call Dec_ASCII

Exit_Proc: mov ah,4ch ;结束程序

int 21h

Buffer db 100 ;输入字符串缓冲区

Code ENDS

END Start ;编译到此结束

1乘法:

MUL AB ;(A)×(B),积的低8位在A中,积的高8位在B中;

C总为0。

2除法:

DIV AB ;(A)÷(B),商在A中,余数在B中。

若(B)= 0 ,则结果不定,(OV)= 1,(C)= 0。

例、试将A中的二进制数转换为3位BCD码,其中,百位数存放于31H单

元,十位数和个位数压缩后存于30H单元中。

解;MOV B,#100

DIV AB

MOV 31H,A

MOV A,#10

XCH A,B

DIV AB

SWAP A

ADD A,B

MOV 30H,A

8个开关分别接P10-P17

控制输出是P00-P07LED灯

还有开关延时6S和按住一个按钮锁住其它按钮

例如:按下P00松开按钮

然后延时5s灯亮并且在5s之内锁住P01-P07的输入

--P00,是接的按键? 前面不是说接到

LED

的吗?

--延时

5s

?前面不是说

6s

吗?

颜色不是自动变的,需要你按Esc键才会变。

call dword ptr ds:[0];对int指令进行模拟,调用原来的int 9 中断例程

cmp al,1

jne int9ret

这三句话,即调用原来的INT 9键盘输入中断,随后判断al的值。当al = 1的时候,才会调用下面的改变颜色 *** 作,而al = 1即是因为按了Esc键。

你重新运行程序,在显示字幕的时候,按Esc键,就会发现字符的颜色改变了。

以上就是关于汇编语言程序求答案全部的内容,包括:汇编语言程序求答案、汇编语言程序设计问题、单片机乘法和除法指令及汇编语言程序举例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存