2016-06-02 2 views
1

어셈블리 TASM에서 부울 변수를 설정하는 방법을 누군가에게 알려 줄 수 있습니까? 나는 인터넷에서보고 있었고 적절한 설명을 찾을 수 없다.어셈블리 - 부울 변수를 설정하는 방법

도움을 주신 모든 분들께 감사드립니다.

+2

부울은 상위 수준 언어의 용어입니다. true vs false는 단일 비트 또는 비트 패턴 또는 규칙입니다 (C 0 (0, 0, 8, 16, 32 또는 64)의 숫자는 0이고 0이 아닙니다. , 16, 32 또는 64 비트에 따라 다름). –

+0

dwelch에 답해 주셔서 감사합니다. 나는 아직도 부울을 어떻게 사용하는지 이해하지 못한다. 어쩌면 간단한 예제를주고 나에게 설명해 주시겠습니까? 고맙습니다. – KatomPower

+0

조건에 따라 바이트를 0 또는 1로 설정하려면 ['setcc'] (http://www.felixcloutier.com/x86/SETcc.html)를 사용하십시오. emu8086이 아닌 dosbox를 사용하기 때문에 많은 유용한 386 명령어를 사용할 수 있습니다. –

답변

0

@dwelch가 맞다. 부울은 높은 수준의 개념이지만 어셈블리에서는 TRUE와 FALSE로 지정할 수있는 상수를 정의 할 수 있으며 코드에서 사용할 수 있습니다. 프로그래머는 "부울"이라는 개념을 직접 만들 수 있습니다.

다음 예제 프로그램에서는 TRUE 및 FALSE를 상수로 정의하고 숫자가있는 경우 문자열에서 숫자를 검색하고 TRUE를 반환하고 그렇지 않으면 FALSE를 반환하고 "부울"결과에 따라 하나의 메시지 또는 다른) EMU8086로 만든 : C의 _Bool/bool 유형의

.model small 
.stack 100h 
.data 
    FALSE equ 0 
    TRUE equ 255 
    pass db 'simple pa55word',0 
    msj1 db 'Your password is OK$' 
    msj2 db 'Your password requires at least one digit$' 

.code 
    mov ax, @data 
    mov ds, ax 

;SEARCH FOR ANY DIGIT IN PASSWORD. 
    mov si, offset pass ;PARAMETER FOR SEARCH_DIGITS. 
    call search_digits ;RETURNS BX = TRUE OR FALSE. 

    cmp bx, TRUE  ;IF BX == TRUE... 
    je good   ;...JUMP TO "GOOD" (ELSE, CONTINUES). 

;THE PASSWORD HAS NO DIGITS. 
    mov ah, 9 
    mov dx, offset msj2 
    int 21h 
    jmp finale 

;THE PASSWORD CONTAINS AT LEAST ONE DIGIT.  
good: 
    mov ah, 9 
    mov dx, offset msj1 
    int 21h 

finale: 
    mov ax, 4c00h 
    int 21h 

;------------------------------------------      
;PROC TO SEARCH FOR ANY DIGIT IN STRING SI.     
;RETURN : BX = TRUE : DIGIT FOUND. 
;   BX = FALSE : NO DIGIT FOUND. 
;MODIFIED REGISTERS : AL, BX, SI. 

search_digits proc  
    mov bx, FALSE  ;NO DIGITS FOUND YET. 
repeat: 
    mov al, [ si ] 
    inc si 
    cmp al, 0   ;IF CHAR IS ZERO... 
    je done   ;STRING END REACHED. 
    cmp al, '0'  ;IF AL < '0'... 
    jb repeat   ;...REPEAT (IT'S NO DIGIT). 
    cmp al, '9'  ;IF AL > '9'... 
    ja repeat   ;...REPEAT (IT'S NO DIGIT). 
    mov bx, TRUE  ;DIGIT FOUND!!! 
done: 
    ret 
search_digits endp  
+1

나를 도와 주신 모든 분들께 감사드립니다. 나는 이제 더 나은 논리를 이해한다. – KatomPower

+0

방금 ​​8 비트 컨테이너에 대해 요청한 'TRUE equ 255'가있는 * true *와 16 비트 레지스터 BX에 * true *를 실제로 저장하는 사이의 불일치 때문에 방금 내 upvote를 놓쳤습니다! –

1
- 64에서

예를 들면 i386 SysV ABIs 변수해야 그들이 0 또는 1,뿐만 아니라 비에 세트에있는 레지스터의 하위 바이트 -0 값이므로 안전하게 AND을 함께 사용하면됩니다. 보통 setcc based on a condition을 사용하면 쉽게 할 수 있습니다.

반환 값을 0 또는 0이 아닌 값으로 테스트해야하는 경우를 제외하고는 사용자 자신의 ABI를 롤업 할 때 비슷한 규칙이 적용됩니다. 그렇다면 @ dwelch의 제안이 적용됩니다. 0이 아닌 비트가 어디에 있는지 신경 쓰지 않는 무언가로 결과를 테스트 할 수 있다면 값을 booleanizing하는 명령을 낭비하지 마십시오. https://stackoverflow.com/tags/x86/info을 참조하십시오.

관련 문제