回 帖 发 新 帖 刷新版面

主题:▆◣各位大虾~~救俺 求解2道题..感谢不尽!

1·从键盘输入一串字符,以*结束输入,找出A出现的个数,并将此个数在屏幕下一行用10进制显示出来

  2·已知在以ARR为首地址的数据区中存放10个带符号字数据,编程将ARR分成两个数组:正数数组P_ARY和负数数组N_ARY,并分别显示正数和负数个数

还有大侠们推荐小弟本 好汇编教材

多谢了[em28]

回复列表 (共2个回复)

沙发


;2005-12-11 13:47:43
;从键盘输入一串字符,以*结束输入,找出A出现的个数,
;并将此个数在屏幕下一行用10进制显示出来

.model tiny

_Enter    macro    ;回车
    mov        dl, 0AH
    mov        ah, 2
    int        21H
    mov        dl, 0DH
    mov        ah, 2
    int        21H
    endm

.code
            org        100H
_main:
            xor        cx, cx
    _@1:
            mov        ah, 1
            int        21H
            cmp        al, 'A'
            jne        _@2
            inc        cx
            jmp        _@1
    _@2:
            xor        al, '*'
            jnz        _@1
            
            _Enter
            
            mov        ax, cx
            mov        cx, 10
            call    print

            mov        ax, 4C00H
            int        21H
print    proc ;提供多种进制的输出
        ;ax 存放要转换的数
    ;cx 存放进制形式 (2 <= 进制 <= 35)
    cmp    cx, 2    
    jl    _error_
    cmp    cx, 35
    ja    _error_
    push    bx    ;保存 bx
    push    dx    ;...
    sub    sp, 16    ;16 (2 * 8)个字节的临时变量
    mov    bx, sp  ;bx 指向变量地址
    xor    dx, dx
_loop:
    cmp    ax, 0
    jne    _next
    cmp    dx, 0
    je    _print
_next:
    div    cx
    cmp    dx, 9        ;比较余数是否大于 9
    ja    _than_nine
    add    dl, '0'
    jmp    _save_dl
_than_nine:
    add    dl, 'A' - 0AH    ;大于 9 的数转换处理
_save_dl:
    mov    ss:[bx], dl
    inc    bx
    cwd
    jmp    _loop
_print:
    dec    bx
_print_next:
    cmp    bx, sp
    jl    _end
    mov    dl, ss:[bx]
    mov    ah, 2
    int    21H
    dec    bx
    jmp    _print_next
_error_:
    xor    ax, ax    ;return false
    ret
_end:
    add    sp, 16    ;恢复堆栈
    pop    dx
    pop    bx
    
    mov    ax, 1    ;return true
    ret
print    endp            
end    _main

板凳


;2005-12-11 13:58:05
;已知在以ARR为首地址的数据区中存放10个带符号字数据,
;编程将ARR分成两个数组:正数数组P_ARY和负数数组N_ARY,
;并分别显示正数和负数个数

.model small

.data
ARR        dw    -71, 0, 4, -5, -89, -12, 34, -56, 23, -456
P_ARY    dw 10 dup (?)
N_ARY    dw 10 dup (?)
strMsg1    db    'plus :', '$'
strMsg2 db    0DH, 0AH, 'negative :', '$'

.code
_main:
            mov        ax, @data
            mov        ds, ax
            
            cld
            lea        si, ARR
            xor        di, di  ;存放正数个数
            xor        bx, bx    ;存放负数个数
            mov        cx, 10
        _@0:
            lodsw
            cmp        ax, 0
            jl        _@1    ;是否小于0
            jng        _@2 ;是否等于0
            mov        ds:[di + N_ARY], ax
            inc        di
            jmp        _@2
        _@1:
            mov        ds:[bx + P_ARY], ax
            inc        bx
        _@2:
            loop    _@0 ;继续循环
            ;输出正数的个数
            lea        dx, strMsg1
            mov        ah, 9
            int        21H
            mov        ax, di
            mov        cx, 10
            call    print
            ;输出负数的个数
            lea        dx, strMsg2
            mov        ah, 9
            int        21H
            mov        ax, bx
            mov        cx, 10
            call    print
            
            mov        ax, 4C00H
            int        21H
print    proc ;提供多种进制的输出
        ;ax 存放要转换的数
    ;cx 存放进制形式 (2 <= 进制 <= 35)
    cmp    cx, 2    
    jl    _error_
    cmp    cx, 35
    ja    _error_
    push    bx    ;保存 bx
    push    dx    ;...
    sub    sp, 16    ;16 (2 * 8)个字节的临时变量
    mov    bx, sp  ;bx 指向变量地址
    xor    dx, dx
_loop:
    cmp    ax, 0
    jne    _next
    cmp    dx, 0
    je    _print
_next:
    div    cx
    cmp    dx, 9        ;比较余数是否大于 9
    ja    _than_nine
    add    dl, '0'
    jmp    _save_dl
_than_nine:
    add    dl, 'A' - 0AH    ;大于 9 的数转换处理
_save_dl:
    mov    ss:[bx], dl
    inc    bx
    cwd
    jmp    _loop
_print:
    dec    bx
_print_next:
    cmp    bx, sp
    jl    _end
    mov    dl, ss:[bx]
    mov    ah, 2
    int    21H
    dec    bx
    jmp    _print_next
_error_:
    xor    ax, ax    ;return false
    ret
_end:
    add    sp, 16    ;恢复堆栈
    pop    dx
    pop    bx
    
    mov    ax, 1    ;return true
    ret
print    endp
end    _main

我来回复

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