汇编语言程序设计问题

从键盘输入并回显若干字符(不超过100个)。将这些字符按照ASCII码由小到大顺序显示;统计其中数字字符、字母字符及其它字符的个数,并作如下显示:

DIGIT: <数字字符个数>

LETER:<字母字符个数>

OTHER:<其它字符个数>

求程序

; 本程序通过编译,运行正确
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,[SI.Arry_Type]
DEC AL
PUSH AX
LEA BX,[SI.Load]
XLAT
MOV [DI][2],AL
POP AX
PUSH AX
LEA BX,[SI.Comp]
XLAT
MOV [DI][3],AL
POP AX
PUSH AX
LEA BX,[SI.Exchange]
XLAT
MOV [DI][7],AL
POP AX
LEA BX,[SI.Store]
XLAT
MOV [DI][9],AL
MOV AL,[SI.Carry]
SHL AL,1
OR AL,[SI.Sort]
XOR AH,AH
LEA BX,[SI.Yes_No]
XLAT
MOV [DI][5],AL
; ------------------按要求排序
MOV SI,[SI.Arry_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.C 2.D

《汇编语言程序设计》 题目解答
3、计算1090H+1280H的和。4、AX=1090H,BX=90H。5、MOV DX,1 MOV AX,-100H MOV BX,16 IMUL BX (1)执行后,AX=F000H,BX=16,DX=FFFFH (2)若将IMUL改为MUL则执行完后,AX=1600H,BX=16,DX=000BH 6、下面程序段中每条指令执行完后,AX的内容是什么(十六进制)?MOV AX,0;AX=0000...

《汇编语言程序设计》复习题答案求救,分析题!高分,谢谢!
六.程序填空 第一空 0FH 第二空 4AH.这一题的基本思想就是把 BX 循环右移四位,取BL,赋给AL,与上0FH,把高四位清零,得低四位,再加上30H,判断是否超过A,因为A的ASCLL与0-9的ASCLL码不是连续的,所以要根据判断结果再加上07H,就这样了。我原是汇编科代表呢!!哈哈 ...

汇编语言的一些程序设计题,谁能举例解答一下
1、交换可以用堆栈进行,AX。BX相互交换内容 PUSH AX PUSH BX POP AX POP BX 这样AX和BX内容就交换了 2、为了方便你理解,写一些不正确的表达式吧 MOV AX,0 相当于 int a=0;XOR AX,AX XOR这个指令,如果后面两个数相同,则为0,并将0存放到第一个寄存器AX中 SUB AX,AX 相当于 ...

汇编语言是一种面向问题的程序设计语言吗
汇编语言是一种面向问题的程序设计语言。编语言仍是面向程序设计的语言,很难从其代码上理解程序设计意图,设计出来的程序不易被移植,故不像其他大多数的高级计算机语言一样被广泛应用。在高级语言高度发展的今天,通常被用在底层,通常是程序优化或硬件操作的场合。

关于汇编语言的一个问题
则执行NEG指令后就变成正数。但有一特例,以单字节数为例:如果原来的操作数为80H,执行NEG指令后,仍为80H,但此时溢出标志OF为1.另外,只有当操作数为0时,在执行NEG指令后,CF标志才为0,对于其他数,执行NEG指令后,CF标志总为1。《微型计算机原理与汇编语言程序设计》 p92 ...

求汇编语言与程序设计高手来。我需要组一份汇编试题请高手给做下。谢 ...
3试问下面的程序段完成的功能是什么? (5分)SAL AX,1 RCL DX,1 5.已知程序段:STRING DB ‘ABCDEFGHIJ’┇ MOV AH,01 ;从键盘输入字符1~9 INT 21H AND AL,0FH DEC AL XOR AH,AH MOV BX,OFFSET STRING ADD BX,AX MOV DL,[BX]MOV AH,02H ;显示输出 INT 21H ┇ 试回答: (1...

汇编语言编程问题
但是 32 位乘以 32 位时,还是要算出 64 位的结果,然后再保留 32 位,准备以后进行其它的计算。如果不计算出完整的 64 位结果,截取 32 位时,往往就会有误差。这样的要求,对于编程的工作量,一点也没有减少,反而,还要多费了不少心思。程序太长了,发表在百度空间:http:\/\/hi.baidu.com\/...

简述计算机程序设计语言(机器语言、汇编语言、高级语言)的优缺点...
1、优点:可直接访问系统接口,汇编程序翻译成的机器语言程序的效率高。2、缺点:汇编语言指令是机器指令的符号化,与机器指令存在着直接的对应关系,所以汇编语言同样存在着难学难用、容易出错、维护困难等缺点。三、高级语言 1、优点:形式上接近于算术语言和自然语言,概念上接近于人们通常使用的概念。

相似回答
大家正在搜