當前位置:編程學習大全網 - 源碼下載 - 超高分請教壹道匯編語言編程問題

超高分請教壹道匯編語言編程問題

;內容是編寫由鍵盤輸入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

結果圖:

上面還有數據沒有顯示,窗口限制沒有辦法

  • 上一篇:c語言如何編寫界面程序
  • 下一篇:子牙傳說源代碼
  • copyright 2024編程學習大全網