assembly 在程序集中阅读输入并计算奇偶校验

3ks5zfa0  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(113)

从键盘读取以$结尾的N位十进制数。(N〈10)。在emu 8086程序(ASM)中打印该数的位数及其数学奇偶性。
我似乎不明白我做错了什么。“input”是一个无效指令吗?我怎么能在汇编中从键盘上读取数字呢?

numCifre db 0

start:
    input number

    mov cx, 0
    .numaraCifre:
        mov ax, number
        xor dx, dx
        div byte 10
        inc cx
        cmp ax, 0
        jne .numaraCifre

    mov dl, cl
    add dl, '0'
    mov ah, 0Ah
    int 21h

    mov ax, number
    and ax, 1
    jz .par
    mov dl, 'I'
    jmp .showParity
    .par:
        mov dl, 'P'
    .showParity:
        mov ah, 0Ah
        int 21h

    mov ax, 4C00h
    int 21h
pes8fvy9

pes8fvy91#

“input”(input number)是否为无效指令?
它当然不是一个 * 指令 *。它可能是一个宏,如果这样定义的话...
在汇编语言中如何从键盘上读取数字?
Inputting multi-radix multi-digit signed numbers with DOS解释了这一点,甚至有一个豪华版提供。
但是对于你的特殊任务
从键盘读取以$结尾的N位十进制数(N〈10)。
输入单个数字(最多9个)将是一件简单的事情:

xor  cx, cx
Again:
  mov  ah, 01h    ; DOS.GetKeystroke
  int  21h        ; -> AL
  cmp  al, '$'
  je   Done
  cmp  al, '0'
  jb   Again      ; Not a digit
  cmp  al, '9'
  ja   Again      ; Not a digit
  mov  bl, al     ; Remember the last (least significant) digit
  inc  cx
  cmp  cx, 9
  jb   Again
Done:

在emu 8086程序(ASM)中打印数字的位数及其数学奇偶校验。
由于位数在0到9之间,因此打印值几乎与您所做的一样,只是您使用了错误的函数编号0Ah。

mov  dl, cl     ; [0,9]
  add  dl, '0'    ; -> ["0","9"]
  mov  ah, 02h    ; DOS.PrintCharacter
  int  21h

对于数学奇偶性(又称偶/奇),你只需要考虑数字的最低有效位,这就是为什么在上面的输入例程中我把最后一位存储在BL寄存器中。

mov  dl, 'P'
  shr  bl, 1      ; Inspecting the lowest bit of the last digit
  jnc  IsEven
  mov  dl, 'I'
IsEven:
  mov  ah, 02h    ; DOS.PrintCharacter
  int  21h

在你的 *.numaraCifre中 * div byte 10是错误的。立即数操作数是不可能的,即使 10 引用内存变量(对于emu 8086,这并不奇怪),它仍然必须是一个而不是一个字节

相关问题