最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

匯編語言 輸入10個(gè)數(shù)排序并輸出的實(shí)現(xiàn)

 更新時(shí)間:2020年01月14日 11:18:49   作者:Coder_L  
這篇文章主要介紹了匯編語言 輸入10個(gè)數(shù)排序并輸出的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一:題目描述

在鍵盤輸入任意10個(gè)數(shù)

  1. 按從小到大排序后,在計(jì)算機(jī)屏幕上先輸出來。要有結(jié)果提示(字符串顯示)。
  2. 將10個(gè)數(shù)做累加,結(jié)果在計(jì)算機(jī)屏幕顯示累加和。

二:偽指令的定義

1.數(shù)據(jù)段

ATAS SEGMENT
  string_1 DB 'Please input a numbers(0-65536):','$'
  string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
  string_3 DB 'The array you have input is:',0ah,0dh,'$'
  string_4 DB 'After Sort the num is:',0ah,0dh,'$'
  string_5 DB ' ','$'
  DATA DW 10 DUP(?) 
  massege DB 'The sum of the array is: ',0ah,0DH,'$'  
DATAS ENDS

說明:

string_1 輸入范圍提示
string_2 輸入錯(cuò)誤提示
string_3 輸出原數(shù)組提示
string_4 輸出排序后數(shù)組提示
string_5 空格符
DATA 緩沖區(qū)數(shù)組

2.堆棧段

STACKS SEGMENT
  DW 256 dup(?)
STACKS ENDS

3.代碼段

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS

三:模塊分解與實(shí)現(xiàn)

1. DOS輸入10個(gè)數(shù)字

輸入10個(gè)無符號(hào)數(shù)存入緩沖區(qū),并且保證 num&lt;65536num &lt; 65536num<65536

為何輸入范圍是65536呢 一個(gè)字的最大表示范圍是 FFFFFFFFFFFF 其在十進(jìn)制的表示下為 65535

HEX FFFF
DEC 65535
BIN 1111 1111 1111 1111

1.1 輸入函數(shù)子程序

;---------輸入函數(shù)(單數(shù)字輸入)------------
Input PROC Near
  push AX
  push BX
  push CX
  push DX
;---------輸入提示--------------

  MOV BX, 0
  CLC
  MOV DX, 0
;----------輸入數(shù)字--------------
  Lp_0:
    MOV AH, 1
    INT 21H
    CMP AL, 20H ;回車
    JE L_CRLF

;-----  x belong to [0,9]  ----------    
    SUB AL, 30H ; ASCII -> int
    JL L_ERROR 
    CMP AL, 9
    JG L_ERROR
;------- string -> int  -----------
    MOV AH, 0  ;將 AL擴(kuò)展成 AX
    XCHG AX, BX ;保護(hù) AX值
    MOV CX, 10
    MUL CX   ; bx *= 10
    ADD AX , BX
    JC L_ERROR ; OVERFLOW處理
    XCHG AX, BX 
    JMP Lp_0
  L_ERROR:
    MOV DX, 0
    MOV BX, 0
    CALL CRLF  ; 換行    
    CALL ERROR ; 輸出錯(cuò)誤提示
    JMP Lp_0
  L_CRLF:     ; 以換行作為一個(gè)數(shù)的結(jié)束標(biāo)志
    MOV DX, 0
    MOV DATA[SI], BX ;
    POP DX
    POP CX
    POP BX
    POP AX
    RET
    Input ENDP

解析函數(shù)功能:

本質(zhì)類似于高精度計(jì)算,將讀入的一個(gè)串轉(zhuǎn)成數(shù)字存儲(chǔ)在DATA數(shù)組中

分成三大部分

  • 一: 輸入提示
  • 二: 錯(cuò)誤判斷及提示
  • 三: 轉(zhuǎn)化為數(shù)字

L_ERROR 錯(cuò)誤處理

L_CRLF 結(jié)束處理

我們來舉一個(gè)123412341234 的例子

Register 1 2 3 4
AX 1 2 3 4
BX 0 1 12 123
CX 10 10 10 10

AX+(BXCX)AX + (BX * CX)AX+(BX∗CX)

最后將結(jié)果存儲(chǔ)在DATA數(shù)組里

2.實(shí)現(xiàn)冒泡排序

冒泡排序作為一個(gè)簡(jiǎn)單的排序算法,時(shí)間復(fù)雜度 O(n2)O(n^2)O(n2) 需要兩層循環(huán),為了提高代碼的可讀性,我們將內(nèi)層的循環(huán)寫成一個(gè)子程序每次調(diào)用

內(nèi)層循環(huán)很簡(jiǎn)單,每次從頭比到尾,遇到比它小的交換就可以了。因?yàn)槭亲植僮鲾?shù),所以循環(huán)的下標(biāo)到18為結(jié)束條件。

;---------Bubble_sort--------------------
Bubble_sort PROC NEAR
  PUSH BX
  PUSH DX
  MOV SI,DI
LOOP1:
  ADD SI,2 
  MOV BX,DATA[DI]
  CMP BX,DATA[SI]
  JA  SWAP
  JMP NEXT
SWAP:  
  MOV DX,DATA[SI]
  MOV DATA[DI],DX
  MOV DATA[SI],BX 
NEXT:
  CMP SI,18
  JL  LOOP1
  POP DX
  POP BX
  RET
  Bubble_sort ENDP 

外層調(diào)用:每次DI+2DI + 2DI+2

;----------Sort-----------
  MOV CX, 9
  MOV DI, 0
  
FOR1:
  CALL Bubble_sort
  ADD DI, 2
  LOOP FOR1

3.DOS輸出到屏幕

 CALL CRLF
  MOV DX, OFFSET string_4 ;'After Sort the num is:'
  MOV AH, 9
  INT 21H

  MOV CX, 10
  MOV DI, 0
FOR2:
  CALL Print
  CALL Space
  ADD DI , 2
  LOOP FOR2
  CALL CRLF

輸出DATA內(nèi)的數(shù)字,每次輸出一個(gè)數(shù)字然后在輸出一個(gè)空格

Print函數(shù):

  1. 利用DIV函數(shù)的特點(diǎn)——每次除10的商放在AX, 余數(shù)放入DX
  2. 并利用棧的 FILO(First in Last Out)的特點(diǎn)

依舊以1234的例子來看一下是怎么處理的

DATA[Num] 1234 123 12 1
DX 4 3 2 1
Stack(PUSH DX) 4 4,3 4,3,2 4,3,2,1
Print(POP DX) 4 34 234 1234

DATA[Num]/10DATA[Num] / 10DATA[Num]/10 的余數(shù)存入DX

Print PROC Near
  PUSH AX
  PUSH BX
	PUSH CX
	PUSH DX 

  MOV CX, 0
  MOV BX, 10
  MOV AX, DATA[DI]
  LAST:
    MOV DX, 0
    DIV BX ; DIV商放AX,余數(shù)放入DX
    PUSH DX
    INC CX
    CMP AX, 0
    JNZ LAST
  AGE:
    POP DX
    OR DX, 30H
    MOV AH, 2
    INT 21H
    LOOP AGE
    POP DX
    POP CX
	  POP BX
	  POP AX
	  RET
    Print ENDP

4.求累加和全部累加到DATA[0]DATA[0]DATA[0] 上直接調(diào)用 Print 函數(shù),因?yàn)镻rint函數(shù)是針對(duì)DATA數(shù)組設(shè)計(jì)的,所以把最后的結(jié)果存入DATA數(shù)組中不需要額外的輸出函數(shù)。

;-------SUM-------------
Get_sum PROC NEAR
  PUSH BX
  PUSH CX

  MOV BX, 0
  MOV CX , 9
  MOV DI, 2
LOP1:
  MOV BX, DATA[0]
  ADD BX, DATA[DI]
  MOV DATA[0], BX
  ADD DI , 2
  LOOP LOP1
  POP CX
  POP BX
  RET
  Get_sum ENDP

5.其他函數(shù)

;----換行子函數(shù)(一個(gè)數(shù)輸入完畢)-------
CRLF PROC Near
  push AX
  push DX
  MOV DL, 0ah
  MOV AH, 2
  INT 21H
  pop DX
  pop AX
  RET
  CRLF ENDP
;---------空格-----------
Space PROC Near
  push AX
  push DX
  MOV DX, OFFSET string_5 ;' '
  MOV AH, 9
  INT 21H
  pop DX
  pop AX
  RET 
  Space ENDP
;----------錯(cuò)誤提示-------------
ERROR PROC Near
  push BX
  push DX
  MOV DX, OFFSET string_2 ; ERROR: OVERFLOW! Please input again:
  MOV AH, 9
  INT 21H
  pop DX
  pop BX
  RET
  ERROR ENDP

四:流程圖

1. 總體流程圖

2. 子程序流程圖

2.1 Input

2.2 Print

2.3 Bubble_Sort

2.4 Get_Sum

五:代碼與運(yùn)行截圖

1,完整版代碼(在MASM運(yùn)行通過)

;-----數(shù)據(jù)段------------
DATAS SEGMENT
  string_1 DB 'Please input 10 numbers(0-65536):','$'
  string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
  string_3 DB 'The array you have input is:',0ah,0dh,'$'
  string_4 DB 'After Sort the num is:',0ah,0dh,'$'
  string_5 DB ' ','$'
  DATA DW 10 DUP(?) 
  massege DB 'The sum of the array is: ',0ah,0DH,'$'  
DATAS ENDS

;-----堆棧段------------
STACKS SEGMENT
  DW 256 dup(?)
STACKS ENDS

;-----代碼段------------
CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS


;-----------程序開始------------
START:
  MOV AX,DATAS
  MOV DS,AX
  MOV SI, 0 ;指針初始化
  MOV CX, 10 ;循環(huán)次數(shù)
;---------Input----------
  MOV DX, OFFSET string_1 ;Please input 10 numbers(0-65536)
  MOV AH, 9
  INT 21H
Lp:
  CALL Input
  ADD SI, 2
  Loop Lp
;--------結(jié)束輸入,換行---------------
  CALL CRLF
  MOV DX, OFFSET string_3 ;'The array you have input is:'
  MOV AH, 9        ;首地址 DS:DX 
  INT 21H
 ;-------輸出 ----------------  
  MOV CX, 10
  MOV DI, 0
Again:
  CALL Print
  CALL Space
  ADD DI , 2
  Loop Again
;/******************************/
;----------Sort-----------
  MOV CX, 9
  MOV DI, 0
  
FOR1:
  CALL Sort
  ADD DI, 2
  LOOP FOR1

  CALL CRLF
  MOV DX, OFFSET string_4 ;'After Sort the num is:'
  MOV AH, 9
  INT 21H

  MOV CX, 10
  MOV DI, 0
FOR2:
  CALL Print
  CALL Space
  ADD DI , 2
  LOOP FOR2
  CALL CRLF
;-------求和輸出---------------------  
  MOV DX, OFFSET massege;
  MOV AH, 9
  INT 21H

  CALL Get_sum
  MOV DI, 0
  CALL Print


EXIT:
  MOV AH, 4CH
  INT 21H


;/************子程序調(diào)用****************/


;---------輸入函數(shù)(單數(shù)字輸入)------------
Input PROC Near
  push AX
  push BX
  push CX
  push DX


  MOV BX, 0
  CLC
  MOV DX, 0
;----------輸入數(shù)字--------------
  Lp_0:
    MOV AH, 1
    INT 21H
    CMP AL, 20H ;空格
    JE L_CRLF

;-----  x belong to [0,9]  ----------    
    SUB AL, 30H ; ASCII -> int
    JL L_ERROR 
    CMP AL, 9
    JG L_ERROR
;------- string -> int  -----------
    MOV AH, 0  ;將 AL擴(kuò)展成 AX
    XCHG AX, BX ;保護(hù) AX值
    MOV CX, 10
    MUL CX   ; bx *= 10
    ADD AX , BX
    JC L_ERROR ; OVERFLOW處理
    XCHG AX, BX 
    JMP Lp_0
  L_ERROR:
    MOV DX, 0
    MOV BX, 0
    CALL CRLF  ; 換行    
    CALL ERROR ; 輸出錯(cuò)誤提示
    JMP Lp_0
  L_CRLF:     ; 以換行作為一個(gè)數(shù)的結(jié)束標(biāo)志
    MOV DX, 0
    MOV DATA[SI], BX ;
    POP DX
    POP CX
    POP BX
    POP AX
    RET
    Input ENDP


;----換行子函數(shù)(一個(gè)數(shù)輸入完畢)-------
CRLF PROC Near
  push AX
  push DX
  MOV DL, 0ah
  MOV AH, 2
  INT 21H
  pop DX
  pop AX
  RET
  CRLF ENDP
;---------空格-----------
Space PROC Near
  push AX
  push DX
  MOV DX, OFFSET string_5 ;' '
  MOV AH, 9
  INT 21H
  pop DX
  pop AX
  RET 
  Space ENDP
;----------錯(cuò)誤提示-------------
ERROR PROC Near
  push BX
  push DX
  MOV DX, OFFSET string_2 ; ERROR: OVERFLOW! Please input again:
  MOV AH, 9
  INT 21H
  pop DX
  pop BX
  RET
  ERROR ENDP

;---------輸出函數(shù)(單數(shù)字輸出)-------------
Print PROC Near
  PUSH AX
  PUSH BX
	PUSH CX
	PUSH DX 

  MOV CX, 0
  MOV BX, 10
  MOV AX, DATA[DI]
  LAST:
    MOV DX, 0
    DIV BX ; DIV商放AX,余數(shù)放入DX
    PUSH DX
    INC CX
    CMP AX, 0
    JNZ LAST
  AGE:
    POP DX
    OR DX, 30H
    MOV AH, 2
    INT 21H
    LOOP AGE
    POP DX
    POP CX
	  POP BX
	  POP AX
	  RET
    Print ENDP

;---------SORT---------------------
SORT PROC NEAR
  PUSH BX
  PUSH DX
  MOV SI,DI
LOOP1:
  ADD SI,2 
  MOV BX,DATA[DI]
  CMP BX,DATA[SI]
  JA  CHANGE
  JMP NEXT
CHANGE:  
  MOV DX,DATA[SI]
  MOV DATA[DI],DX
  MOV DATA[SI],BX 
NEXT:
  CMP SI,18
  JL  LOOP1
  POP DX
  POP BX
  RET
  SORT ENDP  
;-------SUM-------------
Get_sum PROC NEAR
  PUSH BX
  PUSH CX

  MOV BX, 0
  MOV CX , 9
  MOV DI, 2
LOP1:
  MOV BX, DATA[0]
  ADD BX, DATA[DI]
  MOV DATA[0], BX
  ADD DI , 2
  LOOP LOP1
  POP CX
  POP BX
  RET
  Get_sum ENDP

CODES ENDS
  END START

2. 正確運(yùn)行時(shí)截圖

3. 錯(cuò)誤輸入時(shí)截圖

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 匯編語言編譯環(huán)境搭建過程

    匯編語言編譯環(huán)境搭建過程

    這篇文章主要介紹了匯編語言編譯環(huán)境搭建過程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 8086匯編開發(fā)環(huán)境搭建和Debug模式介紹(圖文詳解)

    8086匯編開發(fā)環(huán)境搭建和Debug模式介紹(圖文詳解)

    這篇文章主要介紹了8086匯編開發(fā)環(huán)境搭建和Debug模式介紹,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • VScode配置匯編語言環(huán)境的實(shí)現(xiàn)步驟

    VScode配置匯編語言環(huán)境的實(shí)現(xiàn)步驟

    本文主要介紹了VScode配置匯編語言環(huán)境的實(shí)現(xiàn)步驟,文中通過圖文的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • 匯編語言入門匯編指令及寄存器詳解教程

    匯編語言入門匯編指令及寄存器詳解教程

    這篇文章主要為大家介紹了匯編語言入門匯編指令及寄存器的詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Go 中的循環(huán)是如何轉(zhuǎn)為匯編的(方法詳解)

    Go 中的循環(huán)是如何轉(zhuǎn)為匯編的(方法詳解)

    這篇文章主要介紹了Go 中的循環(huán)是如何轉(zhuǎn)為匯編的,本文通過循環(huán)的匯編代碼給大家講解的非常詳細(xì),代碼簡(jiǎn)單易懂,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 匯編跳轉(zhuǎn)指令使用總結(jié)

    匯編跳轉(zhuǎn)指令使用總結(jié)

    這篇文章主要介紹了匯編跳轉(zhuǎn)指令使用總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Windows10下利用DOSBOX和MASM32搭建匯編語言開發(fā)環(huán)境

    Windows10下利用DOSBOX和MASM32搭建匯編語言開發(fā)環(huán)境

    這篇文章主要介紹了Windows10下利用DOSBOX和MASM32搭建匯編語言開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • UEFI開發(fā)實(shí)戰(zhàn)SlimBootloader中調(diào)用FSP

    UEFI開發(fā)實(shí)戰(zhàn)SlimBootloader中調(diào)用FSP

    這篇文章主要為大家介紹了UEFI開發(fā)實(shí)戰(zhàn)SlimBootloader中調(diào)用FSP基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 一文秒懂匯編中的循環(huán)問題

    一文秒懂匯編中的循環(huán)問題

    這篇文章主要介紹了一文秒懂匯編中的循環(huán)問題,通過每一行指令詳細(xì)分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 匯編語言 輸入10個(gè)數(shù)排序并輸出的實(shí)現(xiàn)

    匯編語言 輸入10個(gè)數(shù)排序并輸出的實(shí)現(xiàn)

    這篇文章主要介紹了匯編語言 輸入10個(gè)數(shù)排序并輸出的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論

富宁县| 肃北| 朝阳区| 郑州市| 湘西| 绥宁县| 通渭县| 海安县| 东宁县| 三门峡市| 兴仁县| 平和县| 阿拉善盟| 香格里拉县| 两当县| 莱芜市| 栖霞市| 温宿县| 纳雍县| 固镇县| 涪陵区| 新巴尔虎左旗| 家居| 旺苍县| 桐城市| 双桥区| 长治县| 青阳县| 江口县| 且末县| 巨鹿县| 宁海县| 吉安县| 保靖县| 玉田县| 安顺市| 隆子县| 濉溪县| 万年县| 嘉善县| 清徐县|