关于一个小的汇编程序,统计2进制数据中0的个数
根据书上的代码,在电脑上运行出现错误,是关于变量addr的错误,我觉得 addr dw number 这条语句应该是不正确的,不能直接这样赋值吧?不知各位大神怎么看。
源代码如下:
data segment
addr dw number ;这句应该不对吧,和下面一句换下顺序也不对
number dw 12
count dw ?
data ends
code segment
main proc far
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov dx,16 ; 这句是什么意思?
mov bx,addr
mov ax,[bx]
test ax,0ffffh
jz exit
mov cx,16
mov dx,0
repeate:
sub ax,0
js shift
inc dx
shift:
shl ax,1
loop repeate
exit:
mov count,dx
ret
main endp
code ends
end start
data segment
addr dw number ;这句应该不对吧,和下面一句换下顺序也不对
number dw 0ffh ;为了方便打印,我把12改为0ffh,打印结果是8
count dw ?
data ends
code segment
main proc far
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov dx,16 ; 这句是什么意思?------ 如果number为0的话就说明有16个0,因为number是dw类型的
mov bx,addr
mov ax,[bx]
test ax,0ffffh ;测试number是否为0
jz exit ;number 为0则跳转
mov cx,16
mov dx,0
repeate:
sub ax,0
js shift ;把最高为当做符号位,为1就跳转
inc dx
shift:
shl ax,1
loop repeate
exit:
;mov count,dx
mov al,dl ;打印统计结果 ---- 打印输出结果为8个
add al,30h
mov dl,al
mov ah,2
int 21h
ret
main endp
code ends
end start
mov dx,16 ;如果number为0的话就说明有16个0,因为number是dw类型的16位
mov bx,addr
mov ax,[bx]
test ax,0ffffh ;测试number是否为0
jz exit ;number 为0则跳转
mov cx,16 ;否则进行0的个数统计,需循环16次
mov dx,0 ;DX清零,统计结果暂存至DX寄存器
repeate:
sub ax,0
js shift ;把最高为当做符号位,为1就跳转
inc dx ;符号位为0,则DX+1
shift:
shl ax,1 ;符号位为1则number逻辑左移一位
loop repeate
exit: ;
mov count,dx
mov al,dl ;打印统计结果为2个
add al,30h
mov dl,al
mov ah,2
int 21h
ret
main endp
code ends
end start