【问题标题】:8086 assembly program function 0ah int 21h8086 汇编程序函数 0ah int 21h
【发布时间】:2016-01-25 07:19:03
【问题描述】:

程序应该接受一个字符和一个奇数(最多 21 个)。

我的问题是它似乎无法正确接受输入,因为它总是跳转到显示错误部分。我的代码有什么问题?

  .model small
    .stack
    .386
    .data
        msg db "Input a character and an odd number(max 21): $"
        msg1 db 10,13,"ERROR: Input an odd number number after the character", 10, 13, '$'
        msg2 db 10,13, "ERROR: Number is not an odd number", 10, 13, '$'
        inp db ?,?,?
    .code

    main proc far
    again:  mov ax,@data
        mov ds, ax

        mov ah, 9
        lea dx, msg
        int 21h

        lea dx, inp
        mov ah, 0Ah
        int 21h

    ;*********number check******
        mov bl, inp+1
        or bl, 30h ; add 30h 
        cmp bl,30h ; '0'
        jnge notnum   ;  <-------PROGRAM ALWAYS GO HERE FOR ANY INPUT I MAKE
        cmp bl,39h ; '9'
        jnle notnum

        mov bl, inp+2
        cmp bl, 00h
        je numIsOneDigit
        or bl, 30h
        cmp bl,30h ; '0'
        jnge notnum
        cmp bl,39h ; '9'
        jnle notnum
    ;***************************

    ;****if odd number check****
    ;numIsTwoDigit
        mov cl, inp+2
        shr cl, 1
        jnc notOdd
        jmp drawDiamond


    numIsOneDigit:  
        mov ch, inp+1
        shr ch, 1
        jnc notOdd
        jmp drawDiamond
    ;***************************

    ;********ERRORS*************
    notnum:
        mov ah, 9
        lea dx, msg1
        int 21h

        jmp again

    notOdd:
        mov ah,9
        lea dx, msg2
        int 21h

        jmp again
    ;************************
    drawDiamond:
        ;some code here
    exit:
        mov ah, 4ch
        int 21h

    main endp
    end main

测试程序:

【问题讨论】:

  • 输入缓冲区错误,缺少缓冲区可以容纳的最大字符数。
  • 谢谢你这是问题

标签: assembly x86-16


【解决方案1】:
inp db ?,?,?

由于您要使用 DOS 输入功能 0Ah,您需要提供正确的输入结构。您将此结构定义为只有 3 个未初始化的字节,但 DOS 期望第一个字节保存缓冲区长度,第二个字节保留,以便它可以返回实际输入的字符数。

知道要输入最多3个字符,正确的结构是:

inp db 4,0,4 dup (0)

它是 4(不是 3),因为 DOS 还会在输入字符串的末尾附加一个回车代码 (13)。这个额外的字节将不计入您在第二个字节中收到的计数中!


纠正这个问题后,您还需要更改程序的其余部分!

;*********number check******
mov bl, inp+1
or bl, 30h ; add 30h 
cmp bl,30h ; '0'

第一个数字(如果有)将位于 inp+3。 第二个数字(如果有)将位于 inp+4。 这些数字已经是字符了,所以我不明白你为什么写了几次or bl, 30h

mov bl, inp+2
cmp bl, 00h
je numIsOneDigit

如果此比较想要检查第二个数字是否可用,那么您需要与 13 进行比较(而不是与 0 进行比较。

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2011-09-11
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多