어셈블리 TASM에서 부울 변수를 설정하는 방법을 누군가에게 알려 줄 수 있습니까? 나는 인터넷에서보고 있었고 적절한 설명을 찾을 수 없다.어셈블리 - 부울 변수를 설정하는 방법
도움을 주신 모든 분들께 감사드립니다.
어셈블리 TASM에서 부울 변수를 설정하는 방법을 누군가에게 알려 줄 수 있습니까? 나는 인터넷에서보고 있었고 적절한 설명을 찾을 수 없다.어셈블리 - 부울 변수를 설정하는 방법
도움을 주신 모든 분들께 감사드립니다.
@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
나를 도와 주신 모든 분들께 감사드립니다. 나는 이제 더 나은 논리를 이해한다. – KatomPower
방금 8 비트 컨테이너에 대해 요청한 'TRUE equ 255'가있는 * true *와 16 비트 레지스터 BX에 * true *를 실제로 저장하는 사이의 불일치 때문에 방금 내 upvote를 놓쳤습니다! –
예를 들면 i386 SysV ABIs 변수해야 그들이 0 또는 1,뿐만 아니라 비에 세트에있는 레지스터의 하위 바이트 -0 값이므로 안전하게 AND
을 함께 사용하면됩니다. 보통 setcc
based on a condition을 사용하면 쉽게 할 수 있습니다.
반환 값을 0 또는 0이 아닌 값으로 테스트해야하는 경우를 제외하고는 사용자 자신의 ABI를 롤업 할 때 비슷한 규칙이 적용됩니다. 그렇다면 @ dwelch의 제안이 적용됩니다. 0이 아닌 비트가 어디에 있는지 신경 쓰지 않는 무언가로 결과를 테스트 할 수 있다면 값을 booleanizing하는 명령을 낭비하지 마십시오. https://stackoverflow.com/tags/x86/info을 참조하십시오.
부울은 상위 수준 언어의 용어입니다. true vs false는 단일 비트 또는 비트 패턴 또는 규칙입니다 (C 0 (0, 0, 8, 16, 32 또는 64)의 숫자는 0이고 0이 아닙니다. , 16, 32 또는 64 비트에 따라 다름). –
dwelch에 답해 주셔서 감사합니다. 나는 아직도 부울을 어떻게 사용하는지 이해하지 못한다. 어쩌면 간단한 예제를주고 나에게 설명해 주시겠습니까? 고맙습니다. – KatomPower
조건에 따라 바이트를 0 또는 1로 설정하려면 ['setcc'] (http://www.felixcloutier.com/x86/SETcc.html)를 사용하십시오. emu8086이 아닌 dosbox를 사용하기 때문에 많은 유용한 386 명령어를 사용할 수 있습니다. –