80x86汇编语言编程:输入格雷码、输出对应的十进制数字

有这样一个题目:


编制将 4 位格雷码转换成十进制的转换程序。


要求在键盘上输入任一格雷码,即在下一行显示出其对应的十进制。


题目网址:http://zhidao.baidu.com/question/484018137.html

;-----------------------

关于格雷码,做而论道以前曾经写过几篇文章,可见下面的链接:


http://hi.baidu.com/do_sermon/item/98803e367eebe2c61a969672


http://hi.baidu.com/do_sermon/item/9730e4299263d00d42634a98


针对现在的这个题目,就不讲述格雷码的原理了,直接在下面列出 10 进制数和格雷码的对应关系。


;10进制  二进制  格雷码


;    0    0000    0000

;    1    0001    0001

;    2    0010    0011

;    3    0011    0010

;    4    0100    0110

;    5    0101    0111

;    6    0110    0101

;    7    0111    0100

;    8    1000    1100

;    9    1001    1101

;   10    1010    1111

;   11    1011    1110

;   12    1100    1010

;   13    1101    1011

;   14    1110    1001

;   15    1111    1000


本题目是《微机原理》的课程设计,就是要用 80x86 汇编语言来编程。


可以通过计算,来求出结果,更简单的是使用查表方法。


下面就是利用查表方法来求出十进制数的全部程序。

;-----------------------

DATAS SEGMENT

    GR   DB  0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8

    MSG1 DB  10, 13, 'Input GR code (0000~1111): $'

    MSG2 DB  10, 13, 'The  NUM  is : $'

DATAS ENDS

;----------------------------------

CODES SEGMENT

    ASSUME CS:CODES, DS:DATAS

START:

    MOV  AX, DATAS

    MOV  DS, AX

FIRST:

    MOV  DX, OFFSET MSG1   ;提示输入

    MOV  AH, 09H

    INT  21H

    MOV  BX, 0

    MOV  CX, 4     ;输入4位

_IN:

    MOV  AH, 01H   ;接收键盘输入

    INT  21H

    CMP  AL, 13     ;是“回车”?

    JE   SEARCH

    ADD  BX, BX

    CMP  AL, '0'     ;为 0 吗?

    JE   _0_

    CMP  AL, '1'     ;为 1 吗?

    JE   _1_

    JMP  FIRST    ;不是 0、1,就转去重新输入

_1_:

    INC  BX

_0_:

    LOOP _IN   ;循环四次,输入四位数

;-----------------------------

SEARCH:        ;查表,确定输入的是几的格雷码

    MOV  SI, 0       ;先假设是 0

S1:

    CMP  BL, GR[SI]

    JE   DISP       ;查到就转移

    INC  SI           ;查下一个

    JMP  S1

;-----------------------------

DISP:

    MOV  DL, 10

    MOV  AH, 02H

    INT  21H

    MOV  DL, 13

    MOV  AH, 02H

    INT  21H

    MOV  DX, OFFSET MSG2   ;提示

    MOV  AH, 09H

    INT  21H

;-----------------------------

;以十进制显示SI的内容

    MOV  AX, SI

    MOV  CX, 0

D1: MOV  AH, 0

    MOV  BL, 10

    DIV  BL

    MOV  DL, AH

    PUSH DX

    INC  CX

    CMP  AL, 0

    JNE  D1

D2: POP  DX

    ADD  DL, 30H

    CMP  DL, 3AH

    JB   D3

    ADD  DL, 07H

D3: MOV  AH, 02H

    INT  21H

    LOOP D2

;----------------------------------

    MOV  AH, 4CH

    INT  21H

CODES  ENDS

    END START

;-----------------------

程序执行后,显示如下:


C:\MASM>GL

Input GR code (0000~1111): 1011

The  NUM  is : 13


C:\MASM>GL

Input GR code (0000~1111): 110

The  NUM  is : 4


C:\MASM>

;-----------------------

本程序共接收四次数字的输入,输入后,不用回车,即可显示出对应十进制数字。

本程序,也可以输入少于四位的格雷码,键入回车后,提前结束输入。

输入少于四位的格雷码时,本程序自动在前面添上0,补足四位。

;-----------------------


你可能感兴趣的:(80x86汇编语言)