回 帖 发 新 帖 刷新版面

主题:求循环结构程序设计和分支结构程序设计的编程代码!!!

由于小弟刚学汇编不久,在学习的过程中遇到了困难啊,希望各位大哥大姐帮帮小弟我啊!题目如下:
(1).从键盘接受一字母,找出它在ASCⅡ码表中的前导字符与后续字符,并按照顺序输出这三个字符。(例如:输入C,则输出 BCD;输入z,则输出yza)
(2).从键盘上输入1—9之间的数,分别用转移表法和地址表法转向9个程序段,这9个程序段分别显示一个字符(A—I)。
(3).进制转换:十→十六;十→二;二→十;十六→十;十六→二

回复列表 (共12个回复)

沙发


;2005年12月10日18:16:20
;从键盘接受一字母,找出它在ASCII 码表中的前
;导字符与后续字符,并按照顺序输出这三个字符。
;(例如:输入C,则输出 BCD;输入z,则输出yza)
; 题目有问题
; 在 ASCII 码表中 'z' 后面不是 'a' 呀

.model small

disp_char    macro    c
            mov        dl, c
            mov        ah, 2
            int        21H
            endm
.stack
.data

.code
_main:
            mov            ah, 1
            int            21H
            
            dec            al
            mov            bl, al
            disp_char    ' '
            disp_char    bl
            inc            bl
            disp_char    bl
            inc            bl
            disp_char    bl

            mov        ax, 4C00H
            int        21H
end _main

板凳


;2005年12月10日 18:32:47
;从键盘上输入1—9之间的数,分别用转移表法和
;地址表法转向9个程序段,这9个程序段分别显
;示一个字符(A—I)。
;我其实真的不清楚什么是转移表法和地址表法
;只是自己理解写了一下,如果不对告诉我

;转移表法
.model small

disp_char    macro    c
            mov        dl, c
            mov        ah, 2
            int        21H
            endm

.stack
.code
_main:
            mov        ah, 1
            int        21H
            sub        al, 31H    
            jb        _exit    ;是否小于 1
            cmp        al, 9
            jg        _exit    ;是否大于 9

            lea        bx, _jump_table
            xor        ah, ah
            shl        ax, 1
            add        bx, ax
            jmp        bx
            
_jump_table:jmp        _disp_A        ;在这里每个跳转指令为 2 个字节
            jmp        _disp_B
            jmp        _disp_C
            jmp        _disp_D
            jmp        _disp_E
            jmp        _disp_F
            jmp        _disp_G
            jmp        _disp_H
            jmp        _disp_I

_disp_A:
            disp_char 'A'
            jmp        _exit
_disp_B:
            disp_char 'B'
            jmp        _exit
_disp_C:
            disp_char 'C'
            jmp        _exit
_disp_D:
            disp_char 'D'
            jmp        _exit
_disp_E:
            disp_char 'E'
            jmp        _exit
_disp_F:
            disp_char 'F'
            jmp        _exit
_disp_G:
            disp_char 'G'
            jmp        _exit
_disp_H:
            disp_char 'H'
            jmp        _exit
_disp_I:
            disp_char 'I'
            jmp        _exit
_exit:
            mov        ax, 4C00H
            int        21H
end _main

3 楼


;2005年12月10日 18:32:47
;从键盘上输入1—9之间的数,分别用转移表法和
;地址表法转向9个程序段,这9个程序段分别显
;示一个字符(A—I)。
;我其实真的不清楚什么是转移表法和地址表法
;只是自己理解写了一下,如果不对告诉我

;地址表法
.model small

disp_char    macro    c
            mov        dl, c
            mov        ah, 2
            int        21H
            endm

.stack
.data
address_table dw    _disp_A, _disp_B, _disp_C,
                    _disp_D, _disp_E, _disp_F,
                    _disp_G, _disp_H, _disp_I
.code
_main:
            mov        ax, @data
            mov        ds, ax

            mov        ah, 1
            int        21H
            sub        al, 31H    
            jb        _exit    ;是否小于 1
            cmp        al, 9
            jg        _exit    ;是否大于 9
            xor        ah, ah
            shl        al, 1
            mov        bx, ax
            jmp        [bx + address_table]
            
_disp_A:
            disp_char 'A'
            jmp        _exit
_disp_B:
            disp_char 'B'
            jmp        _exit
_disp_C:
            disp_char 'C'
            jmp        _exit
_disp_D:
            disp_char 'D'
            jmp        _exit
_disp_E:
            disp_char 'E'
            jmp        _exit
_disp_F:
            disp_char 'F'
            jmp        _exit
_disp_G:
            disp_char 'G'
            jmp        _exit
_disp_H:
            disp_char 'H'
            jmp        _exit
_disp_I:
            disp_char 'I'
            jmp        _exit
_exit:
            mov        ax, 4C00H
            int        21H
end _main

4 楼

;2005年12月10日 19:04:52
;进制转换:十→十六;十→二;二→十;十六→十;十六→二

.model small
.stack
.data
pszDec    db '100', 0
pszHex    db    4 dup(?), 0
pszBin    db    16 dup(?), 0


.code
_main:
            mov        ax, @data
            mov        ds, ax
            mov        es, ax

            lea        si, pszDec
            lea        di, pszHex
            call    DecStringToHexString

            lea        si, pszDec
            lea        di, pszBin
            call    DecStringtoBinString

            mov        ax, 4C00H
            int        21H
;****************************************************
;DecStringToBin
;功能:
;    十进制字符串转换为机器数
;入口参数:
;    SI 存放要转换的字符串的地址
;返回值:
;    AX
;****************************************************
DecStringToBin    proc
            push    bx
            push    cx
            cld

            xor        ax, ax
            xor        bx, bx
            mov        cx, 10
_@DecStringToBin_1:
            lodsb        ;从 10 进制字符串中取出一个字节到 al, si 增一
            sub        al, 30H
            jb        _@DecStringToBin_2
            cmp        al, 9
            ja        _@DecStringToBin_2
            push    ax
            push    bx
            pop        ax
            pop        bx
            mul        cx
            add        bx, ax
            jmp        _@DecStringToBin_1
_@DecStringToBin_2:
            mov        ax, bx
            pop        cx
            pop        bx
            ret
DecStringToBin    endp

;****************************************************
;BinToDecString
;功能:
;    机器数转换为十进制字符串
;入口参数:
;    AX 存放机器数
;    SI 存放要转换后的字符串的地址
;****************************************************
BinToDecString    proc
            push    dx
            push    cx
            cld

            mov        cx, 10
_@BinToDecString_1:
            xor        dx, dx
            div        cx        ;出以 10
            push    ax        ;暂时保存商
            mov        al, dl
            add        al, '0' ;余数加 '0'
            stosb
            pop        ax        ;弹出商
            test    ax, ax
            jnz        _@BinToDecString_1

            pop        cx
            pop        bx
            ret
BinToDecString    endp
;未完...

5 楼

;****************************************************
;HexStringToBin
;功能:
;    16 进制字符串转换为机器数
;入口参数:
;    SI 存放要转换的字符串的地址
;返回值:
;    AX
;*****************************************************
HexStringToBin    proc
            push    bx
            push    cx
            cld
            
            xor        bx, bx    ;最终转换的数暂存在 BX
            xor        ax, ax
            mov        cl, 4
_@HexStringToBin_1:
            lodsb        ;al = byte ptr ds:[si]
            cmp        al, '0'
            jb        _@HexStringToBin_4 ;al < 0 ?
            cmp        al, '9'
            ja        _@HexStringToBin_2 ;al <= 9 ?
            sub        al, '0'
            jmp        _@HexStringToBin_3
_@HexStringToBin_2:
            or        al, 'a' - 1    ;转换为小写
            cmp        al, 'a'
            jb        _@HexStringToBin_4
            cmp        al, 'f'
            ja        _@HexStringToBin_4
            sub        al, 'a'
_@HexStringToBin_3:
            shl        bx, cl
            add        bx, ax
            jmp        _@HexStringToBin_1
_@HexStringToBin_4:
            mov        ax, bx
            pop        cx
            pop        bx
            ret
HexStringToBin    endp


;****************************************************
;DecStringToHexString
;功能:
;    10 进制字符串转换为 16 进制的字符串
;入口参数:
;    SI 存放要转换的字符串的地址
;    DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;*****************************************************
DecStringToHexString    proc
            push    bx
            push    cx
            push    dx
            
            push    si        ;保存 SI
            call    DecStringToBin
            pop        si
            mov        bx, ax

            cld
            mov        dx, 0F000H
            mov        cx, 12
_@DecToHex_3:
            mov        ax, bx
            and        ax, dx
            shr        ax, cl
            add        al, '0'
            cmp        al, '9'
            jna        _@DecToHex_4
            add        al, 8
_@DecToHex_4:
            stosb
            mov        ch, cl
            mov        cl, 4
            shr        dx, cl
            sub        ch, 4
            mov        cl, ch
            jns        _@DecToHex_3
_ret_DecToHex:
            pop        dx
            pop        cx
            pop        bx
            ret
DecStringToHexString    endp
;未完。。。

6 楼

;**************************************************
;DecStringtoBinString
;功能:
;    10 进制字符串转换为 2 进制的字符串
;入口参数:
;    SI 存放要转换的字符串的地址
;    DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
DecStringtoBinString    proc
            push    bx
            push    cx

            push    si
            call    DecStringToBin
            pop        si
            mov        bx, ax
            
            mov        cx, 16
_@DecStringtoBinString_0:
            mov        al, '0'
            shl        bx, 1
            jnc        _@DecStringtoBinString_1
            inc        al
_@DecStringtoBinString_1:
            stosb
            loop    _@DecStringtoBinString_0

            pop        cx
            pop        bx
            ret
DecStringtoBinString    endp

;**************************************************
;BinStringToDecString
;功能:
;    2 进制字符串转换为 10 进制的字符串
;入口参数:
;    SI 存放要转换的字符串的地址
;    DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
BinStringToDecString    proc
            push    bx
            
            ;先把 2 进制字符串转换为机器数, 存放在 bx 中
            xor        bx, bx
            mov        ah, 16
            
            cld
_@BinStringToDecString_0:
            lodsb
            sub        al, '0'
            jb        _@BinStringToDecString_3
            cmp        al, 1
            ja        _@BinStringToDecString_3
            stc        ;CF = 1
            je        _@BinStringToDecString_2    ;al == 1 ?
            clc        ;CF = 0
_@BinStringToDecString_2:
            rcl        bx, 1
            dec        ah
            jnz        _@BinStringToDecString_0
_@BinStringToDecString_3:
            mov        ax, bx
            call    BinToDecString

            pop        bx
            ret
BinStringToDecString    endp
;未完...

7 楼

;**************************************************
;HexStringToDecString
;功能:
;    16 进制字符串转换为 10 进制的字符串
;入口参数:
;    SI 存放要转换的字符串的地址
;    DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
HexStringToDecString    proc
            call    HexStringToBin
            mov        si, di
            call    BinToDecString
            ret
HexStringToDecString    endp

;**************************************************
;HexStringToBinString
;功能:
;    16 进制字符串转换为 2 进制的字符串
;入口参数:
;    SI 存放要转换的字符串的地址
;    DI 存放的是转换后字符传的地址
;注意默认数据段为 DS(ES = DS), 字符串结尾标志为 0
;**************************************************
HexStringToBinString    proc
            push    bx
            push    cx

            call    HexStringToBin
            mov        bx, ax
            cld
            mov        cx, 16
_@HexStringToDecString_0:
            mov        al, '0'
            shl        bx, 1
            jnc        _@HexStringToDecString_1
            inc        al
_@HexStringToDecString_1:
            stosb
            loop    _@HexStringToDecString_0

            pop        cx
            pop        bx
            ret
HexStringToBinString    endp
end _main
;完

8 楼

注意第 3 问,有部分没有测试因为时间问题.
如果发现什么问题一定告诉我 ^_^

9 楼

非常感谢erping
这么快就回帖啦

10 楼

厉害厉害,对我很有用,谢谢哈```

我来回复

您尚未登录,请登录后再回复。点此登录或注册