CX减少2而不是1为什么?

时间:2017-04-26 15:56:01

标签: loops assembly x86-16 dos

我是汇编语言的新手,我做了一个简单的程序,它添加了两个int数组(在数据段中描述为word)并打印并将其保存到第三个变量。我已经使用outdec(一个程序)来打印总和(它要求值在ax中打印)。我的问题是我的两个数组中都有8个元素,为了访问每个元素,cx的值应该是8,因为我的循环重复8次以获得这两个元素中的每一个。但如果我使用cx,8所以我的程序只打印4个元素的总和,除非我把cx,16。当我在每次迭代检查cx的值时我发现cx递减2即16,14,12,10但是怎么可能?当我使用byte而不是word数据类型时,cx正常工作。我的问题是,某种方式c​​x与数据类型有关吗?因为根据我的意思,无论我使用什么数据类型我的变量cx应该减1。

.model small
.stack 100h
.data
arr1 dw 21,32,65,76,56,-11,10,-34
arr2 dw 0,11,-3,90,43,56,66,9
outp dw lengthof arr1 dup(?)

.code
main proc
mov ax, @data
mov ds, ax
mov cx, 16
mov si, 0
traverse:
mov ax,  word ptr arr1[si]
add ax, word ptr arr2[si]
mov outp[si], ax
call outdec
mov ah, 2
mov dl, ','
int 21h
dec cx
add si, 2
loop traverse

mov ah, 4ch
int 21h 

main endp

outdec proc
push ax
push bx
push cx
push dx
mov bx,10
mov cx,0
cmp ax,0
jge @else
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
neg ax
@else:
mov bx,10
mov dx,0
div bx
push dx
inc cx
cmp ax,0
jnz @else
print_label:
pop dx
mov ah,2
add dl,48
int 21h
loop print_label
pop dx
pop cx
pop bx
pop ax
RET
outdec endp
end main

0 个答案:

没有答案