首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2013-06-26 
关于一个小的汇编程序,统计2进制数据中0的个数根据书上的代码,在电脑上运行出现错误,是关于变量addr的错误

关于一个小的汇编程序,统计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        


    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

热点排行