当前位置: 代码迷 >> 汇编语言 >> 关于一个小的汇编程序,统计二进制数据中0的个数
  详细解决方案

关于一个小的汇编程序,统计二进制数据中0的个数

热度:282   发布时间:2016-05-02 04:54:23.0
关于一个小的汇编程序,统计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

------解决方案--------------------
data segment 
   addr dw number   
   number dw 012h 
   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