超高分请教一道汇编语言编程问题

作者&投稿:藩鬼 (若有异议请与网页底部的电邮联系)
一道汇编语言编程题目 求大神帮帮忙~

DATA SEGMENT BUF DB -14,20,3,-17,64,88,-96,-11,115,7 N EQU $-BUF STR1 DB N DUP(?) STR2 DB N DUP(?) PLUS DB 0 MINUS DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BUF LEA DI,STR1 LEA BX,STR2 MOV CX,N CLD @0: LODSB AND AL,AL JS @1 STOSB INC PLUS JMP @2 @1: MOV [BX],AL INC MINUS INC BX @2: LOOP @0 MOV AH,4CH INT 21H CODE ENDS END START; 注:0归到正数数组中

DATA SEGMENT
STRING DB '1.Assemble language is very hard to study.2.You must pay more attention.'
COUNT EQU $-STRING;求串长度
UCCOUNT DB ?;存大写字母个数
LCCOUNT DB ?;存小写字母个数
NCOUNT DB ?;存数字个数
SCOUNT DB ?;存空格个数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,STRING
MOV CX,COUNT
NEXT:
MOV AL,[SI]
CMP AL,20H
JNZ NEXTN
INC SCOUNT
JMP NEXT1
NEXTN:
CMP AL,30H
JB NEXT1
CMP AL,39H
JA NEXTLC
INC NCOUNT
JMP NEXT1
NEXTLC:
CMP AL,41H
JB NEXT1
CMP AL,5AH
JA NEXTUC
INC LCCOUNT
JMP NEXT1
NEXTUC:
CMP AL,61H
JB NEXT1
CMP AL,7AH
JA NEXT1
INC LCCOUNT
NEXT1:
INC SI
LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START

;内容是编写由键盘输入10个4位的数据并将这些数由大到小或由小到大进行排序其结果输出在显示屏上的程序.

ASSUME CS:CODE, SS:STACK, DS:DATA

DATA SEGMENT

STR DB 0AH,0DH,"Please input a thousand number: ",0AH,0DH,'$'

BUF DB 5;缓冲区能容纳的字符个数

DB ?;系统自动存入用户从键盘输入的字符的个数(不包括回车)

DB 5 DUP (?);存放用户从键盘输入的字符的ASCII码(包括回车)

COUNT EQU 10

NUMBER DW 10 DUP (0)

MULNUMBER DW ?

CRLF DB 0AH,0DH,'$'

DATA ENDS

STACK SEGMENT

DB 16 DUP (?)

STACK ENDS

CODE SEGMENT

START:MOV AX,DATA

MOV DS,AX;设置好数据段

MOV AX,STACK

MOV SS,AX;设置好数据段

MOV SP,10H;设置好栈顶指针

MOV DI,0

MOV CX,COUNT;将10赋值给CX

INPUT:

PUSH CX;因为下面会用到CX,所以为了不覆盖CX的值,我们将CX存放在栈保存着

LEA DX,STR

MOV AH,9

INT 21H;显示提示信息

LEA DX,BUF

MOV AH,10

INT 21H;接收用户从键盘输入的信息

LEA SI,BUF+2;取BUF+2的偏移地址,然后赋值给SI,这个BUF+2的地址是存放用户输入的地址单元

MOV BX,3

;下面的程序段是将用户输入的4个字符转换成4位数(十六进制)

;TOTAL = 千位的数字*1000+百位的数字*100+十位的数字*10+个

MOV MULNUMBER,1;乘数

MOV CL,BUF+1

NEXT:XOR AX,AX

MOV AL,[SI+BX];与用户输入的4位数的个位数

SUB AL,30H;因为字符数字的ASCII码是以30H+数字,所以数字=ASCII - 30H

MUL MULNUMBER;因为4位数不超过65535,所以我们不用里DX中的值,因为只有乘出来的积打印65535,DX才会有变化

ADD NUMBER[DI],AX;将积和TOTAL相加

XOR AX,AX;AX清零

MOV AL,10

MUL MULNUMBER

MOV MULNUMBER,AX;乘数*10

DEC BX;指向高一位

LOOP NEXT

ADD DI,2;指向NUMBER的下一个字单元

POP CX;恢复原来的CX的值

LOOP INPUT;循环输入

;接下来就是排序了

;这里我们用冒泡排序,升序

;冒泡排序的思想是:从第一个元素开始,依次对N个元素中相邻的两个元素进行比较

;若顺序不满足则交换,经过一轮后,最大的元素就排到了最右边.后面依次类推

MOV CX,COUNT

DEC CX

MOV DI,0;最右边有多少个元素,一开始是0个

SEQU1:PUSH CX

MOV BX,0

MOV CX,COUNT

SUB CX,DI

SEQU2:MOV AX,NUMBER[BX];前一个元素

CMP AX,NUMBER[BX+2];后一个元素

JB SEQU3;如果前一个元素小于后一个元素,就不要交换了

;以下4句是交换NUMBER[BX+2]和NUMBER[BX]地址的值

XCHG AX,NUMBER[BX+2]

MOV DX,NUMBER[BX]

MOV NUMBER[BX+2],DX

MOV NUMBER[BX],AX

SEQU3:ADD BX,2

LOOP SEQU2

INC DI;右边有一个最大元素,DI+1

POP CX

LOOP SEQU1

;下面是将排好序的数显示出来

LEA SI,NUMBER

MOV BX,0

MOV CX,COUNT

DISPLAY:

PUSH CX;保存CX的值

MOV CX,10

XOR DX,DX

MOV AX,NUMBER[BX]

DIS1:DIV CX

PUSH DX;保存余数

XOR DX,DX;DX清零,因为做字除法的时候,(DX,AX)都会参与运算,在这里我们只需要AX运算,如果有DX运算的话,那么结果会出错

AND AX,AX;测试AL(商是否为0)

JNZ DIS1;如果不是0,说明没有除尽,继续循环

;输出回车,换行

LEA DX,CRLF

MOV AH,9

INT 21H

;现在栈里的元素是5个CX,DX,DX,DX,DX,而DX从左到有时个位,十位,百位,千位

;所以现在我们倒着输出,就可以得到千,百,十,个

MOV CL,4;四位数

DIS2:POP DX

ADD DL,30H

MOV AH,2

INT 21H

LOOP DIS2

ADD BX,2;下一个元素

POP CX

LOOP DISPLAY

MOV AX,4C00H

INT 21H

CODE ENDS 

END START


结果图:

上面还有数据没有显示,窗口限制没有办法



DATA SEGMENT
LEN EQU 10
//定义宏 LEN=10
ARRAY DW 10 DUP(?)
//定义word型数组 ARRAY[10]
MESS DB 0DH,0AH,'PLEASE INPUT NUMBERS',0DH,0AH,'INPUT:$'
//定义字符串MESS="\r\nPLEASE INPUT NUMBERS\r\nINPUT:"
ENTER DB 0DH,0AH,'$'
//定义回车符ENTER="\r\n"
SY DB 0DH,0AH,'SORT END OUTPUT DATA :','$'
//定义字符串SY="\r\nSORT END OUTPUT DATA :"
NUMBER DB 5,0,5 DUP(?)
//定义byte型数组NUMBER={5,0,?,?,?,?,?}
CHANGE DB 0
//定义byte型变量CHANGE=0
DATA ENDS

STACK SEGMENT STACK
STA DB 64 DUP(0)
STACK_TOP DB 0
STACK ENDS
//堆栈空间64+1=65byte,STACK_TOP为栈顶
//不过好像程序里没有用到堆栈操作

CODE SEGMENT
ASSUME CS:CODE, DS:DATA , SS:STACK

START: MOV AX, DATA
MOV DS, AX
MOV AX,STACK
MOV SS,AX
//段寄存器初始化
LEA SP, STACK_TOP
//堆栈指针初始化
MOV BX, OFFSET ARRAY
//把ARRAY的偏移地址赋给BX
//即BX指向ARRAY[0]
MOV CX,LEN
设置循环次数10次
A :MOV AH,09H
LEA DX,MESS
INT 21H
//屏幕显示字符串MESS的内容
LEA DX,NUMBER
MOV AH,0AH
INT 21H
//从键盘输入东西到NUMBER
LEA DI,NUMBER
//DI指向NUMBER[0]
MOV DL,[DI+2]
//DL等于NUMBER[2]
SUB DL,30H
//DL=DL-30H
//(说明:30H就是'0',这个操作把字符转换成数字,例如'1'->1)
MOV AH,DL
SHL AH,01
SHL AH,01
SHL AH,01
SHL AH,01
//AH=DL*16
MOV DL,[DI+3]
//DL=NUMBER[3]
SUB DL,30H
//转换
ADD AH,DL
//AH=AH+DL
MOV DL,[DI+4]
//DL=NUMBER[4]
SUB DL,30H
//转换
MOV AL,DL
SHL AL,01
SHL AL,01
SHL AL,01
SHL AL,01
//AL=DL*16
MOV DL,[DI+5]
//DL=NUMBER[5]
SUB DL,30H
//转换
ADD AL,DL
//AL=AL+DL
MOV [BX],AX
//ARRAY[0]=AX
ADD BX,02
//BX=BX+2,即BX现在指向ARRAY[1]的地址
LOOP A
//循环
SORT: MOV BX, OFFSET ARRAY
//BX指向ARRAY[0]
MOV CX,LEN-1
//设置循环次数9次
MOV CHANGE, 0
//初始化CHANGE=0
GOON: MOV AX,[BX]
//AX=ARRAY[0]
ADD BX,2
//BX指向ARRAY[1]
CMP AX,[BX]
//ARRAY[0]和ARRAY[1]比较大小
JB NEXT
//如果ARRAY[0]>ARRAY[1]则不进行处理,继续下一步
MOV CHANGE, 1
//否则的话 CHANGE=1 并执行下面的代码
XCHG AX, [BX]
MOV [BX-2], AX
//交换ARRAY[0]和ARRAY[1]
//处理结束,下一步
NEXT: LOOP GOON
//循环
CMP CHANGE, 0
//CHANGE和0比较大小
JNE SORT
//如果CHANGE不等于0,则继续SORT
//SORT第一次把最小的数放在了最后
//SORT第二次把第二小的数放在了倒数第二的位置,以此类推
MOV CX,LEN
//设置循环次数10次
//排序结束,下面开始输出
LEA SI,ARRAY
//SI指向ARRAY[0]
MOV AH,09H
LEA DX,SY
INT 21H
//屏幕显示字符串SY的内容
B :MOV AH,09H
LEA DX,ENTER
INT 21H
//屏幕输出一个回车
MOV BX,[SI]
//BX=ARRAY[0]
MOV DH,BH
//DH=BH
AND BH,0F0H
//BH的低四位清零
SHR BH,1
SHR BH,1
SHR BH,1
SHR BH,1
//BH高四位转移到低四位
ADD BH,30H
//BH=BH+30H
//这个操作把数字转换成字符
MOV DL,BH
MOV AH,02
INT 21H
//输出BH,即ARRAY[0]的最高位
AND DH,0FH
ADD DH,30H
MOV DL,DH
MOV AH,02
INT 21H
//输出ARRAY[0]的次高位
MOV DH,BL
AND BL,0F0H
SHR BL,01
SHR BL,01
SHR BL,01
SHR BL,01
ADD BL,30H
MOV DL,BL
MOV AH,02
INT 21H
AND DH,0FH
ADD DH,30H
MOV DL,DH
MOV AH,02
INT 21H
//输出ARRAY[0]的后两位
ADD SI,2
//SI指向ARRAY[1]
LOOP B
//循环
MOV AX,4C00H
INT 21H
//程序结束
CODE ENDS
END START

DATA SEGMENT ;数据段,都这么写
LEN EQU 10 ;变量LEN=10
ARRAY DW 10 DUP(?) ;定义10个DW字类型的变量,成为一个数组ARRAY
MESS DB 0DH,0AH,'PLEASE INPUT NUMBERS',0DH,0AH,'INPUT:$';DB字节类型的变量MESS,0DH,0AH控制回车,'PLEASE INPUT NUMBERS'用来显示,0DH,0AH再回车,显示'INPUT:',$表示字符串内容结束
ENTER DB 0DH,0AH,'$';ENTER表示回车
SY DB 0DH,0AH,'SORT END OUTPUT DATA :','$';回车,打印'SORT END OUTPUT DATA :,$作用同上
NUMBER DB 5,0,5 DUP(?); 同上
CHANGE DB 0 ;变量CHANGE=0
DATA ENDS ;数据段结束

STACK SEGMENT STACK ;这是堆栈段,老师不会让你讲它,固定格式
STA DB 64 DUP(0)
STACK_TOP DB 0
STACK ENDS

CODE SEGMENT;代码段
ASSUME CS:CODE, DS:DATA , SS:STACK;这里也是固定的,不会问

太尼玛长了 我放弃咯 囧、、、


超高分请教一道汇编语言编程问题
超高分请教一道汇编语言编程问题 内容是编写由键盘输入10个4位的数据并将这些数由大到小或由小到大进行排序其结果输出在显示屏上的程序.程序已经写好:DATASEGMENTLENEQU10ARRAYDW10DUP(?)MESSDB0DH,0AH,'PLEASEINPUT... 内容是编写由键盘输入10个4位的数据并将这些数由大到小或由小到大进行排序其结果输出在...

mov ah 01h int 21h and al 0fh这个指令是什么意思啊,诸位程序高手求解...
mov ah,... 1 2010-05-03 汇编里 mov ah,1 int 21h是什么意思 124 2015-11-13 汇编语言程序,求大神解决 2012-11-02 汇编语言编程问题 1 2014-12-09 详细解释下面的汇编程序 2 2012-12-13 超高分请教一道汇编语言编程问题 6 2010-12-27 汇编语言程序设计题目,在线等答案!!!急!!!... 2 ...

&超高分&请问学网络那种技术最吃香?
简单的说,Linux是Unix克隆(Unix clone)或Unix风格(Unix alike)的操作系统(OS),在原代码级上兼容绝大部分Unix标准(指的是IEEE POSIX,System V,BSD),是一个支持多用户, 多进程,多线程,实时性较好的功能 强大而稳定的操作系统.它可以运行x86PC,Sun Sparc,Digital Alpha,680x0,PowerPC, MIPS等平台上...

超高分请教一道汇编语言编程问题
;内容是编写由键盘输入10个4位的数据并将这些数由大到小或由小到大进行排序其结果输出在显示屏上的程序.ASSUME CS:CODE, SS:STACK, DS:DATA DATA SEGMENT STR DB 0AH,0DH,"Please input a thousand number: ",0AH,0DH,'$'BUF DB 5;缓冲区能容纳的字符个数 DB ?;系统自动存入用户从键盘...

林口县15946514951: 高分急求一道汇编程序题目的答案 -
望供纳科: 你没有说明是有符号数还是无符号数.我且当作无符号数来作.以下是核心程序.由于很长时间没有作,可能一些语法不正确或者是指令不正确.请楼主改正.LEA SI,NUMLEA DI,SOURCE MOV CX,100 CLD XOR AX,AX NEXT3: LODSB MOV AL,SI CMP AL,40 JA NEXT1 SUB AL,30 STOSB JMP NEXT2 NEXT1: SUB AL,AL-40+10 STOSB NEXT2: LOOP NEXT3

林口县15946514951: 高分悬赏 汇编语言题请高手来解答. -
望供纳科: 看了下,程序编写正确,没有问题.至于你说到的编译时错误,我想与星研集成环境软件有关. 补充回答:1、org 100h 调整偏移量伪指令ORG:告诉汇编程序,本伪指令下面的内存变量从该“数值表达式”所指定的地址开始分配.如非特别需要,没有必要,可有可无.2、loop Q0 循环指令:跳转到标号Q0处,继续执行循环体.3、mov ah,4ch dos功能调用4ch号功能:结束程序4、int 21h dos功能调用 这些是汇编语言的常识,必须掌握.

林口县15946514951: 汇编问题,非高手闪开,请高手回答高分! -
望供纳科: 1. data segmentbuf0 db 100buf1 db 0buf db 100 dup('$')data endsexit macro mov ah,4ch int 21h endmwrite macro c mov dl,...

林口县15946514951: 求问一道汇编语言的编程题? 高分求解!
望供纳科: data segment a db 00h x db "000" y db "000 ",0Dh, 0Ah, "$" data ends code segment assume cs:code, ds:data main: mov ax, data mov ds, ax mov ax, 0B800h mov es, ax xor di, di mov ax , 0003h int 10h mov al, 0h mov [a], al cld again: call ...

林口县15946514951: 高分求助:期末考题;汇编语言题:1'输入一个数,判断范围,在范围内就输出,不在就提示. -
望供纳科: 若范围[A,B].MODEL SMALL .DATAMSG DB "error" .CODE.STARTUP MOV AH, 0HINT 16HCMP AL,AJL errCMP AL,BJG errMOV DL, ALMOV AH, 2INT 21HJMP ederr:MOV BP, OFFSET MSGMOV CX, 5HMOV AL, 0MOV BH, 0MOV DH, 5MOV DL, 20MOV AH, 13HINT 10H ed: .EXIT 0 END 自己检查下行不行吧,不想再多写

林口县15946514951: 高分请教几道简单的汇编题?
望供纳科:1.会使ESP-4 2.PUSHAD指令在堆栈中按顺序压入下列寄存器:EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI3 esp-20=13ffa4 EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI pushad的时候ESP依次减了这么多.每个4字节.加起来正好是20H

林口县15946514951: 汇编语言编程问题:用键盘输入一个字符串,含有若干大小写字母,数字,要求统计出三种类型各有多少个,并显示 -
望供纳科: ;用键盘输入一个字符串(回车结束),含有若干大小写字母,数字,要求统计出三种类型各有多少个,并显示 data segment mess db 0dh,0ah,'Input String: $' sz db 0 ;数字个数 dAx db 0 ;大写个数 xXx db 0 ;小写个数 SZ_C DB 100 DUP ('$'...

林口县15946514951: 急~!2天内高分求准确汇编语言完整过程(3道题目) -
望供纳科: 其实第一问和第二问世差不多,如果想设计完美的程序,应...

林口县15946514951: 汇编语言编程问题;编写一个汇编语言程序.能每隔10秒显示数字 分别为0、1、2、3、4、5、6、7、8、9、 -
望供纳科: ORG 0000H ; 数码管共阴 AJMP MAIN ORG 000BH T0MS EQU NOT 50000 ; 100 mS 晶振 6.000 MHz PJSBZ EQU 20H PJSBZY EQU 21H PST0: MOV TL0, #LOW T0MS ; T0 中断 MOV TH0, #HIGH T0MS SETB PJSBZ ; 100 mS 标志 DJNZ R6,...

林口县15946514951: 高分求解:几个简单的汇编程序编程
望供纳科: 1. mov bx, ax2. mov dx, 3ffh3. mov bx, ds:[2ah]4. MOV BYTE PTR [SI], BH5. MOV [BX+DI], 90H6. 没看懂,向前 还是向后,我写了一个 方向递增,你自己看看需不需要改 .MODEL SMALL .486 .CODE BEGIN: MOV AX, 1000H MOV DS, AX MOV ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网