如何划分两位数

时间:2017-08-19 03:09:23

标签: assembly x86

我需要显示问题,用户将回答Y或N.我总共有5个问题,1个问题有20个分数。我需要5 * 20 = 100之类的东西。 当用户回答Y时,countY db 0将增加20

我已成功计算出标记,但如何显示为标记的是两位数字(例如80),它也可能是一个3位数字(例如100)。

Q1: 
    mov ah, 09h
    lea dx, msgq1
    int 21h
    mov ah, 01h
    int 21h
    mov myInput, al
    cmp myInput, 59h
    JE I1
    jmp Q2


  I1:
    mov dl, countY
    add dl,20
    mov countY, dl

  ;calculation
  Cal:
    mov ah,02h
    mov dl, countY
    add dl, 30h  ; display countY=80;
    mov countY, dl
    int 21h

    ;NOT WORKING, ERROR CODE
    mov bl,10
    mov al, countY
    cbw
    div bl

    mov q, al
    mov r, ah

    mov ah, 02h
    mov q, al
    int 21h

1 个答案:

答案 0 :(得分:2)

cal:
mov ah,02h
mov dl, countY
add dl, 30h  ; display countY=80;
mov countY, dl
int 21h
;NOT WORKING, ERROR CODE
mov bl,10
mov al, countY
cbw
div bl

通过这种划分你是正确的方式,但它太糟糕了,它上面的几行确实破坏了 countY 中的值。

一旦你从分区获得商和余数,你需要用DOS显示它们。首先是商,然后是余数。但是你不要忘记通过向每个字符添加30h来将它们变成字符。

cal:
  mov bl,10
  mov al, countY     ;Values are {0,20,40,60,80}
  cbw                ;Prepare for division of AX/BL
  div bl             ; -> AL=quotient AH=remainder
  mov  dx, ax        ;Conveniently moving both to DX
  add  dx, 3030h     ;Adding 30h to each in a single instruction
  mov  ah, 02h
  int  21h           ;Display the tenths
  mov  dl, dh
  mov  ah, 02h
  int  21h           ;Display the ones

唯一缺少的是分数可能精确到100的情况,因此需要3位数 只需检测它,显示一个前导“1”,从商中减去10,然后像以前一样继续:

cal:
  mov  bl,10
  mov  al, countY    ;Values are {0,20,40,60,80,100}
  mov  ah, 0         ;Prepare for division of AX/BL
  div  bl            ; -> AL=quotient AH=remainder
  cmp  al, 10
  jl   Skip
  push ax            ;Save AX because the DOS call destroys it's value
  mov  dl, "1"
  mov  ah, 02h
  int  21h           ;Display the hundreds
  pop  ax            ;Restore AX
  sub  al, 10
Skip:
  mov  dx, ax        ;Conveniently moving both to DX
  add  dx, 3030h     ;Adding 30h to each in a single instruction
  mov  ah, 02h
  int  21h           ;Display the tenths
  mov  dl, dh
  mov  ah, 02h
  int  21h           ;Display the ones

通过将cbw更改为mov ah,0,此版本的代码可以显示0到199之间的所有数字。