汇编语言程序设计题求高手

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言程序设计题求高手相关的知识,希望对你有一定的参考价值。

1.编写一个程序实现:在BUF开始的存储区中存放30个带符号数,试统计其正数、负数和零的个数,并将统计的个数分别放到PLUS、NEGATIVE、ZERO单元中。
2.若内存BUF开始的单元中存放10个无序的有符号数,试用冒泡法将它们升序排列。
要求:实验前要做好充分准备,包括程序框图,源程序清单,调试步骤,调试方法,以及对程序结果的分析等。

1.编写一个程序实现:在BUF开始的存储区中存放30个带符号数,试统计其正数、负数和零的个数,并将统计的个数分别放到PLUS、NEGATIVE、ZERO单元中。

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
BUF db 23,-69,0,35,46,0,57,68,0,79,81,98,-43,251,21,15,-69,0,58,159,-27,-89,65,76,85,123,0,253,193,121
Elements equ ($-BUF)/Type BUF ;元素个数
Plus db 0 ;正数计数
Negative db 0 ;负数计数
Zero db 0 ;零计数
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
lea si,BUF ;取数据地址
mov cx,Elements ;元素个数
Statics: cmp byte ptr [si],0 ;是否0?
jnz $+8 ;不是
inc Zero ;是,0计数
jmp Next_One
test byte ptr [si],80h ;是否正数?
jnz $+8 ;不是
inc Plus ;是,正数计数
jmp $+6
inc Negative ;负数计数
Next_One:inc si ;si增1,判断下一个元素
loop Statics
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

2.若内存BUF开始的单元中存放10个无序的有符号数,试用冒泡法将它们升序排列。
; 冒泡法排序
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 定义常量
Yes EQU 1
No EQU 0
On EQU 1
Off EQU 0
; -----------------------------------------
; 定义结构类型
Bubb_Para Struc ; 冒泡排序法参数表
Carry DB No ; 是否带符号。Yes:有符号数;No:无符号数
Sort DB No ; 升序/降序。Yes:升序;No:降序
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
; -----------------------------------------
; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。
; 子程序原型:对字节元素进行无符号升序排序。
Bubbling Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
; ------------------根据排序参数,修改排序指令
LEA SI,Parameters
LEA DI,@@Compare
MOV AL,TYPE BUF
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 CX,Elements ;外循环次数
@@Scanning: PUSH CX ;入栈保存外循环次数
LEA SI,BUF ;数组首地址装入源变址寄存器
@@Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入累加器
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若大于,交换数组元素
STOSB ;保存数值较小者
@@NextOne: LOOP @@Compare ;处理下一个数组元素
POP CX ;外循环次数出栈
LOOP @@Scanning ;下一趟比较
; ------------------
POP DI
POP SI
POP CX
POP BX
POP AX
RET
Bubbling EndP
BUF DB -112,56,72,98,32,251,97,63,123,21 ;需要排序的数据
Elements EQU ($-BUF)/Type BUF-1 ; 外循环次数
Parameters Bubb_Para <Yes,Yes>
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
call Bubbling ;对BUF中的元素按无符号数、升序排序
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
参考技术A 1.AX=1F3FH,BX=0204H,CX=1D3BH
2.AL=30(或者1EH),BL=10(或者0AH)
3.count=8
(我怀疑A1的定义里面是不是多了一个“,”。如果去掉那个逗号,则count=7)
表示A1中数据的个数
4.CF=1,SF=0,ZF=1,OF=0
参考技术B STACK
SEGMENT
STACK
DB
200
DUP(0)
STACK
ENDS
DATA
SEGMENT
STR1
DB
80
DB
0
DB
80
DUP(0)
DB
'$'
STR2
DB
81
DUP(0)
INPUT
DB
0
COUNT
DB
0
COUNT0
DB
0
COUNT1
DB
0
COUNT2
DB
0
ASK1
DB
0AH,0DH,"Please
input
a
string:
$"
ANSW0
DB
0AH,0DH,"String
length:
$"
ANSW1
DB
0AH,0DH,"Number
:
$"
ANSW2
DB
0AH,0DH,"Wode
:
$"
ANSW3
DB
0AH,0DH,"Arranged
string:
$"
RESULT1
DB
0AH,0DH,"Password
Right!$"
RESULT2
DB
0AH,0DH,"Password
Error!$"
MESSAGE
DB
0AH,0DH,"Press
any
key
to
continue!$"
DATA
ENDS
CODE
SEGMENT
ASSUME
ES:DATA,DS:DATA
ASSUME
SS:STACK,CS:CODE
START:
MOV
AX,DATA
MOV
DS,AX
MOV
ES,AX
LEA
DX,ASK1
MOV
AH,9
INT
21H
LEA
DX,STR1
;count
the
number
and
the
word
MOV
AH,10
INT
21H
MOV
BL,STR1+1
MOV
COUNT,BL
LEA
DI,STR1
CALL
COUNT_NUM
LEA
DX,ANSW0
;print
the
string
length
MOV
AH,9
INT
21H
XOR
DX,DX
MOV
DL,COUNT
CALL
PRINT_NUM
LEA
DX,ANSW1
;print
the
number's
count
MOV
AH,9
INT
21H
XOR
DX,DX
MOV
DL,COUNT1
CALL
PRINT_NUM
LEA
DX,ANSW2
;print
the
word's
count
MOV
AH,9
INT
21H
XOR
DX,DX
MOV
DL,COUNT2
CALL
PRINT_NUM
LEA
DI,STR1+2
CALL
TRUN_SET
;take
out
the
'
'
LEA
DX,ANSW3
MOV
AH,9
INT
21H
LEA
DI,STR1+2
CALL
PRINT_STRING
LEA
DX,ASK1
;input
the
word
and
change
to
'*',but
can't
del
MOV
AH,9
INT
21H
LEA
DI,STR2
CALL
INPUT_PASS
XOR
CX,CX
;compare
two
string
MOV
CL,COUNT
INC
CX
CMP
CL,COUNT0
JNE
NEXT0
LEA
SI,STR1+2
LEA
DI,STR2
CLD
REPZ
CMPSB
JNE
NEXT0
LEA
DX,RESULT1
MOV
AH,9
INT
21H
JMP
EXIT
NEXT0:
LEA
DX,RESULT2
MOV
AH,9
INT
21H
EXIT:
LEA
DX,MESSAGE
MOV
AH,9
INT
21H
MOV
AH,8
INT
21H
MOV
AH,4CH
INT
21H
;all
the
function.
INPUT_PASS
PROC
LOOP0:
MOV
AH,8
INT
21H
CMP
AL,0DH
JE
EXIT0
MOV
BYTE
PTR
[DI],AL
INC
DI
INC
COUNT0
MOV
DL,2AH
MOV
AH,2
INT
21H
JMP
LOOP0
EXIT0:
MOV
BYTE
PTR
[DI],'$'
RET
INPUT_PASS
ENDP
COUNT_NUM
PROC
INC
DI
LOOP1:
INC
DI
MOV
AH,BYTE
PTR
[DI]
CMP
AH,0DH
JE
EXIT1
CMP
AH,30H
JB
NEXT1
CMP
AH,39H
JA
NEXT1
INC
COUNT1
JMP
LOOP1
NEXT1:
CMP
AH,41H
JB
LOOP1
CMP
AH,5AH
JA
NEXT2
INC
COUNT2
JMP
LOOP1
NEXT2:
CMP
AH,61H
JB
LOOP1
CMP
AH,7AH
JA
LOOP1
INC
COUNT2
JMP
LOOP1
EXIT1:
RET
COUNT_NUM
ENDP
PRINT_NUM
PROC
MOV
AX,DX
MOV
CL,0AH
DIV
CL
XOR
DX,DX
MOV
DL,AL
ADD
AH,30H
XOR
BX,BX
MOV
BL,AH
PUSH
BX
CMP
AL,0
JE
EXIT2
CALL
PRINT_NUM
EXIT2:
POP
AX
MOV
DL,AL
MOV
AH,2
INT
21H
RET
PRINT_NUM
ENDP
TRUN_SET
PROC
MOV
BX,0
LOOP2:
CMP
BL,COUNT
JAE
NEXT5
CMP
BYTE
PTR[DI+BX],'
'
JE
NEXT3
INC
BX
JMP
LOOP2
NEXT3:
MOV
CX,BX
LOOP3:
CMP
BL,COUNT
JB
NEXT4
MOV
BX,CX
DEC
COUNT
JMP
LOOP2
NEXT4:
MOV
AL,BYTE
PTR[DI+BX+1]
MOV
BYTE
PTR[DI+BX],AL
INC
BX
JMP
LOOP3
NEXT5:
MOV
AL,BYTE
PTR[DI+BX]
CMP
AL,'
'
JNE
EXIT3
DEC
BX
JMP
NEXT5
EXIT3:
MOV
BYTE
PTR[DI+BX],'$'
MOV
COUNT,BL
DEC
COUNT
RET
TRUN_SET
ENDP
PRINT_STRING
PROC
XOR
BX,BX
MOV
BL,COUNT
LOOP4:
CMP
BL,0
JE
EXIT4
MOV
DL,BYTE
PTR[DI+BX]
MOV
AH,2
INT
21H
DEC
BX
JMP
LOOP4
EXIT4:
MOV
DL,BYTE
PTR[DI+BX]
MOV
AH,2
INT
21H
RET
PRINT_STRING
ENDP
CODE
ENDS
END
START

C语言编程题求代码,不会做啊

题目描述从键盘输入若干数据整数(零表示结束),统计出数据个数,以及最大值、最小值和平均值。
用一个函数实现数据输入的功能,其首部为:
int Input(int s[])
Input的参数为输入的数据,函数返回值大于0表示该行输入的数据个数,0表示输入结束。
用一个函数实现求最大值、最小值和平均值的功能,首部为:
void statistics(int n, int s[], int *max, int *min, float *avg)输入从键盘输入若干数据整数(零表示结束)输出统计出数据个数,以及最大值、最小值和平均值 样例输入1 2 3 4 5 0样例输出Num=5
Max=5
Min=1
Avg=3.000

 

一时半会儿没理解你这句话“函数返回值大于0表示该行输入的数据个数,0表示输入结束。”,只能写成这个样了,你稍微改改。

#include<stdio.h> 

int Input(int s[]) 

 int i=0;

    scanf("%d",&s[i]); 

    while(s[i++]!=0)

 

  scanf("%d",&s[i]); 

    

 s[i]='\\0';

 return *s;

 

void statistics(int n, int s[], int *max, int *min, float *avg)

 int i=0,j=0,temp,sum=0;

 temp=s[0];

 for(i=1;i<n;i++)

    if(s[i]>temp) temp=s[i];

 *max=temp;   

 temp=s[0];

 for(i=1;i<n;i++)

    if(s[i]<temp) temp=s[i];

    *min=temp;

    for(i=0;i<n;i++)

  sum+=s[i];

 *avg=(float(sum/(1.0*n)));

 

void main()   

 int num=0,max=0,min=0,data[100];

 float avg=NULL;

 printf("Input(0表示结束):\\n");

    Input(data);

 while(data[num]!='\\0')

  num++;

 statistics(num,data,&max,&min,&avg);

 printf("Num=%d\\nMax=%d\\nMin=%d\\nAvg=%.3f\\n",num,max,min,avg);

 

 

参考技术A 编程大赛的题么?自己想吧,多行输入,多行输出,0结束,编程大赛的破题追问

不是,就一道课后习题而已代码怎么写啊

追答

scanf接受输入,用一个变量存储数据就可以了
int tmp = 0;

while(1)
scanf(" %d", &tmp);
if (tmp == 0) break;

统计数据个数,明白了么,我只加了一个变量而已;
int tmp = 0;
int count = 0;
while(1)
scanf(" %d", &tmp);
if (tmp == 0) break;
count++;


求平均值,你要学会用最少的变量完成某个任务,就像下面这样,但是,你首先要保证不能使程序变得反复无常;
int tmp = 0;
int count = 0;
double avg = 0;
while(1)
scanf(" %d", &tmp);
if (tmp == 0) break;
count++;
avg += tmp;


avg /= count;
最大值最小值,你也只需要这样就行了;
int tmp = 0;
int count = 0;
int max = 0;
int min = 0;
double avg = 0;
while(1)
scanf(" %d", &tmp);
if (tmp == 0) break;
count++;
avg += tmp;
if (max tmp) min = tmp; /* 这里为什么要加else,想不出来去问老师*/

avg /= count;
行了,程序就这么简单,把它拾掇拾掇就OK了;
int func (double *avg, int *max, int *min)

int tmp = 0;
int count = 0;
*avg = 0; *max = 0; *min = 0;
while ( 1)
scanf(" %d", &tmp);
if (tmp == 0) break;
count++;
*avg += tmp;
if (*max tmp) *min = tmp;

*avg /= count;
return count;

主函数:
#include
int main (void)

int count, max, min;

double avg;

while (1)

count = func(&avg, &max, &min);
if (count == 0) break;

printf("%lf, %d, %d\n", avg, max, min);



return 0;

以上是关于汇编语言程序设计题求高手的主要内容,如果未能解决你的问题,请参考以下文章

C语言编程题求代码,不会做啊

哪位高手帮我把汇编语言程序转换成c语言程序啊?(对了是51单片机程序)

线性方程组求解——C语言程序设计代码,高手们,拜托啦!急急急啊!!!

高手们,帮忙啊,c语言程序设计

麻烦哪位高手解释一下这个C语言程序中,那个word 有啥用?

C语言程序设计题 找高手必须稳对的 明天考试