在汇编语言中查找ODD和EVEN数字的SUM

时间:2018-05-09 07:59:02

标签: assembly

我有一个赋值,通过条件跳转找到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 :(得分:0)

如果考虑数字的二进制形式,您将看到一个模式:最右边的位在奇数处设置(= 1),在偶数处设置(= 0)。当您隔离该位时,您可以“有条件地”将该数字添加到一个或另一个总和中。

主要有两种方法可以隔离位并处理它:

  1. 使用AND 1TEST 1获取Zero标志。如果数字是偶数(结果= 0)则设置,如果数字是奇数(结果= 1)则不设置。使用JZJNZ来处理该号码。

  2. 将数字右移到Carry标志并使用JCJNC(“如果进位设置为跳转”或“如果未设置进位则跳转”)跳转到相应的例程。

  3. 请注意,ANDSHR会更改注册。我建议将其复制到另一个寄存器中,并在操作后将其恢复。 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
    ...