Найти СУММУ ODD и ДАЖЕ цифры на ассемблере - PullRequest
0 голосов
/ 09 мая 2018

У меня есть задание найти сумму четных и нечетных цифр 123456789 с помощью условного перехода. Сумма четных цифр будет сохранена в AX, а сумма нечетных цифр будет сохранена в регистре BX.

Я буду использовать два массива для решения этой проблемы.

2,4,6,8

1,3,5,7,9

Сумма первого массива будет сохранена в AX, а второго массива в BX в шестнадцатеричном формате.

Проблема в том, что я новичок в ассемблере и не имею понятия об условных переходах для решения этой проблемы. Может ли кто-нибудь помочь мне решить это задание простым способом?

    [org 0x0100]
    jmp start
    message: db '123456789'            ; string to be printed
    length: dw 20                        ; length of string
    clrscr:         push es
    push ax
    push cx
    push di
    mov ax, 0xb800
    mov es, ax                          ; point es to video base
    xor di, di                          ; point di to top left column
    mov ax, 0x0720                      ; space char in normal attribute
    mov cx, 2000                        ; number of screen locations
    cld                                 ; auto increment mode
    repstosw                            ; clear the whole screen

    pop di
    pop cx
    pop ax
    pop es
    ret

    ; subroutine to print a string
    ; takes the x position, y position, attribute, address of string and
    ; its length as parameters

    printstr:         push bp
    mov bp, sp
    push es
    push ax
    push cx
    push si
    push di
    mov ax, 0xb800
    mov es, ax                        ; point es to video base
    mov al, 80                        ; load al with columns per row
    mul byte [bp+10]                  ; multiply with y position
    add ax, [bp+12]                   ; add x position
    shl ax, 1                         ; turn into byte offset

    mov di,ax                         ; point di to required location
    mov si, [bp+6]                    ; point si to string
    mov cx, [bp+4]                    ; load length of string in cx
    mov ah, [bp+8]                    ; load attribute in ah
    cld                               ; auto increment mode

    nextchar: lodsb                   ; load next char in al
    stosw                             ; print char/attribute pair
    loopnextchar                      ; repeat for the whole string
    pop di
    pop si
    pop cx
    pop ax
    pop es
    pop bp
    ret 10

    start: call clrscr                ; call the clrscr subroutine
    mov ax, 10
    push ax                           ; push x position
    mov ax, 15
    push ax                           ; push y position
    mov ax, 0x12                      ; blue on black attribute
    push ax                           ; push attribute
    mov ax, message
    push ax                           ; push address of message
    push word [length]                ; push message length
    callprintstr                      ; call the printstr subroutine
    mov ax, 0x4c00                    ; terminate program
    int 0x21

1 Ответ

0 голосов
/ 09 мая 2018

Если вы рассмотрите двоичную форму чисел, вы увидите шаблон: самый правый бит установлен (= 1) на нечетное число и не установлен (= 0) на четное число. Выделив этот бит, вы можете «условно» добавить число к той или иной сумме.

В основном есть два способа изолировать бит и обработать его:

  1. Используйте AND 1 или TEST 1, чтобы получить нулевой флаг. Он устанавливается, если число четное (результат = 0), и не устанавливается, если оно нечетное (результат = 1). ИСПОЛЬЗУЙТЕ JZ или JNZ для обработки номера.

  2. Сдвиньте номер прямо во флаг переноса и используйте JC или JNC («прыгать, если перенос не установлен» или «прыгать, если перенос не установлен»), чтобы перейти к соответствующей процедуре.

Обратите внимание, что AND и SHR изменяют регистр. Я рекомендую скопировать его в другой реестр и восстановить после операции. TEST не меняет регистр.

Пример с TEST:

...
mov cx, 9               ; Count downward from 9 to 1
xor ax, ax              ; sum of even numbers
xor bx, bx              ; sum of odd numbers

l1:                     ; Entry point for the loop
test cx, 1              ; Is CX even?
jz l2                   ; Yes -> jump to the label l2
add bx, cx
jmp l3                  ; Skip the following instruction for even numbers
l2:
add ax, cx
l3:
loop l1                 ; Repeat until CX becomes 0
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...