1. 程式人生 > >彙編程式:統計一個字的二進位制表示中1的個數

彙編程式:統計一個字的二進位制表示中1的個數

                                                 統計一個十六位字中1的個數的彙編小程式

思路:利用邏輯左移指令shl的功能: 

                 如 shl ax, 1  將ax中的最高位放在psw中CF中,然後,將其餘的位依次左移一位,最後一位用0填充。

                 該字為16位,邏輯左移16次,就可以把該字中的所有位都依次放入了CF,  統計這十六次移位中CF位為1的個數,

                 也就是該字中二進位制表示中1的個數, 同時,16次邏輯左移後,該字就被填充為0000h , 可以通過測試其是否為0,作為退出條件。

編碼如下:

Code:
  1. ;例 5.2 在addr單元中存放著數y(十六位的字)的地址,試編制一程式把Y中1的的個數存入到單元count中   
  2. data segment   
  3.     org 10   
  4.     number_y dw 8877h   
  5.     addr_y dw   ?   
  6.     count db ?   
  7. data ends   
  8. code segment   
  9.     assume cs:code, ds:data   
  10. start:    
  11.     mov ax, data   
  12.     mov ds, ax   
  13.     mov bx, offset number_y   
  14.     mov addr_y, bx   
  15.     mov bx, addr_y   
  16.     mov ax, word ptr [bx]   
  17.     mov cl, 0   
  18. next:   
  19.     test ax, 0ffffh   
  20.     jz  exit   
  21.     shl ax,1   
  22.     jnc next   
  23.     inc cl   
  24.     jmp next   
  25. exit:   
  26.     mov count, cl   
  27.     mov dl,cl   
  28.     add dl, 30h    
  29.     mov ah,02h   
  30. int 21h   
  31.     mov ah, 4ch   
  32. int 21h    
  33. code ends   
  34.     end start   
Code:
  1. ;例 5.2 在addr單元中存放著數y(十六位的字)的地址,試編制一程式把Y中1的的個數存入到單元count中   
  2. data segment   
  3.     org 10   
  4.     number_y dw 8877h   
  5.     addr_y dw   ?   
  6.     count db ?   
  7. data ends   
  8. code segment   
  9.     assume cs:code, ds:data   
  10. start:    
  11.     mov ax, data   
  12.     mov ds, ax   
  13.     mov bx, offset number_y ; move the relatvie address of number_y to bx    
  14.     mov addr_y, bx          ; move  the address in bx to addr_y memory unit   
  15.     mov bx, addr_y          ; move the content of addr_y memory unit to bx   
  16.     mov ax, word ptr [bx]   ; mov the number_y to ax indrectly!   
  17.     mov cl, 0               ; init cl 0, for count the 1 in the ax (number_y)   
  18. next:   
  19.     test ax, 0ffffh  ; test ax is zero?   
  20.     jz  exit         ;   if 0 , all bits has been tested, exit it      
  21.     shl ax,1         ; logical shift left, the highest bit is putted into CF   
  22.     jnc next         ;      if CF=0, the highest bit is 0 ; continue
  23.     inc cl           ;          if cf=1, the hightest bit is 1, so increase cl   
  24.     jmp next         ;  contine   
  25. exit:   
  26.     mov count, cl    ; save the number of 1 in ax to the memory unit count   
  27.     ; display the number in the memory unit count , assume  its value little to 10   
  28.     mov dl,cl   
  29.     add dl, 30h    
  30.     mov ah,02h   
  31. int 21h   
  32. ; the exit system call   
  33.     mov ah, 4ch   
  34. int 21h    
  35. code ends   
  36.     end start