我有一个赋值,通过条件跳转找到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
答案 0 :(得分:0)
如果考虑数字的二进制形式,您将看到一个模式:最右边的位在奇数处设置(= 1),在偶数处设置(= 0)。当您隔离该位时,您可以“有条件地”将该数字添加到一个或另一个总和中。
主要有两种方法可以隔离位并处理它:
使用AND 1
或TEST 1
获取Zero标志。如果数字是偶数(结果= 0)则设置,如果数字是奇数(结果= 1)则不设置。使用JZ
或JNZ
来处理该号码。
将数字右移到Carry标志并使用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
...