문제
임무의 마지막 부분에 문제가 있습니다. 우리는 비트 등의 스트림 등을 얻습니다. 스트림에는 텍스트 부분에 1의 수가있는 정수가 있습니다. 나는 그 정수와 그 24가 올바르게 얻습니다. 이제 나는 얻는 텍스트 데이터를 고려하고 거기에 1을 모두 계산하려고합니다. 그러나 내 Proc은 항상 0을 반환하고 있습니다.
나는 그것이 제대로 반복되고 있는지 확인할 수 있었다.
텍스트 = hello 인 hello는 16 1입니다. 여기에 해당 텍스트를 통해 반복을위한 프로토리가 있습니다.
sub AX,AX
sub SI,SI
mov bx,[bp+6] ;get message offset
@@mainLoop:
mov cx,8
mov dh,80h
cmp byte ptr [bx + si],0
je @@endChecker
@@innerLoop:
test byte ptr [bx + si],dh
jz @@zeroFound
inc AX
@@zeroFound:
shr bh,1
loop @@innerLoop
@@continue:
inc si
jmp @@mainLoop
Proc의 나머지 부분은 단지 푸시/팝입니다. 실제로 이것을 원하는 것은 테스트를 사용하여 1000000000을 바이트와 비교하는 것입니다. 1 Inc Ax가 마스크를 1 씩 바로 돌리고 전체 바이트를 다음 바이트로 돌리고 다시 수행하는 것입니다.
해결책
'shr bh, 1'은 아마도 'shr dh, 1'이어야합니다.
다른 팁
내부 루프의 대안적이고 짧은 구현을 제공하기 위해 :
mov cx, 8
mov dh, byte ptr [bx+si]
@@innerLoop:
add dh, dh
adc ax, 0
loop @@innerLoop
여기서 우리는 비트를 전혀 테스트하지 않습니다. 대신 ADD DH, DH는 최상위 비트를 캐리로 바꾸고 SHL DH와 동일합니다.
Addc Ax, 0은 캐리를 도끼에 추가합니다.
제휴하지 않습니다 StackOverflow