IBM PC DOS, 8088 어셈블리, 54 35 바이트
차이 방법을 사용하여 -19 바이트
ac2c 41d0 d8d7 7206 51b1 04d2 e859 240f 2c03 02e0 e2ea 3534 4527 4125 1303 1462 4523 13
미 조립 :
; compare dashes and dots in a morse code string
; input:
; I: pointer to input string (default SI)
; IL: length of input string (default CX)
; TBL: pointer to data table (default BX)
; output:
; Sign/OF flags: Dot-heavy: SF == OF (JGE), Dash-heavy: SF != OF (JL)
MORSE_DD MACRO I, IL, TBL
LOCAL LOOP_LETTER, ODD
IFDIFI <I>,<SI> ; skip if S is already SI
MOV SI, I ; load string into SI
ENDIF
IFDIFI <IL>,<CX> ; skip if IL is already CX
MOV CX, IL ; set up loop counter
ENDIF
IFDIFI <TBL>,<BX> ; skip if TBL is already BX
MOV BX, OFFSET TBL ; load letter table into BX
ENDIF
LOOP_LETTER:
LODSB ; load next char from DS:SI into AL, advance SI
;AND AL, 0DFH ; uppercase the input letter (+2 bytes)
SUB AL, 'A' ; convert letter to zero-based index
RCR AL, 1 ; divide index by 2, set CF if odd index
XLAT ; lookup letter in table
JC ODD ; if odd index use low nibble; if even use high nibble
PUSH CX ; save loop counter (since SHR can only take CL on 8088)
MOV CL, 4 ; set up right shift for 4 bits
SHR AL, CL ; shift right
POP CX ; restore loop counter
ODD:
AND AL, 0FH ; mask low nibble
SUB AL, 3 ; unbias dash/dot difference +3 positive
ADD AH, AL ; add letter difference to sum (set result flags)
LOOP LOOP_LETTER
ENDM
TBL DB 035H, 034H, 045H, 027H, 041H, 025H, 013H, 003H, 014H, 062H, 045H, 023H, 013H
설명
Intel / MASM 구문에서 8088 호환 명령 만 사용하여 MACRO (기본적으로 함수)로 구현되었습니다. 대문자 문자열 (또는 대소 문자를 허용하기 위해 +2 바이트)로 입력하고 출력 Truthy / Falsy 결과는 SF == OF
(사용 JG
또는 JL
테스트)입니다.
문자 차이 테이블 값은 이진 니블로 저장되므로 총 13 바이트 만 걸립니다.
원본 (54 바이트) :
; compare dashes and dots in a Morse code string
; input:
; I: pointer to input string (default SI)
; IL: length of input string (default CX)
; TBL: pointer to data table
; output:
; Carry Flag: CF=1 (CY) if dot-heavy, CF=0 (NC) if dash-heavy
MORSE_DD MACRO I, IL, TBL
LOCAL LOOP_LETTER
IFDIFI <I>,<SI> ; skip if S is already SI
MOV SI, I ; load string into SI
ENDIF
IFDIFI <IL>,<CX> ; skip if IL is already CX
MOV CX, IL ; set up loop counter
ENDIF
MOV BX, OFFSET TBL ; load score table into BX
XOR DX, DX ; clear DX to hold total score
LOOP_LETTER:
LODSB ; load next char from DS:SI into AL, advance SI
;AND AL, 0DFH ; uppercase the input letter (+2 bytes)
SUB AL, 'A' ; convert letter to zero-based index
XLAT ; lookup letter in table
MOV AH, AL ; examine dot nibble
AND AH, 0FH ; mask off dash nibble
ADD DH, AH ; add letter dot count to total
PUSH CX ; save loop counter (since SHR can only take CL)
MOV CL, 4 ; set up right shift for 4 bits
SHR AL, CL ; shift right
POP CX ; restore loop counter
ADD DL, AL ; add letter dash count to total
LOOP LOOP_LETTER
CMP DL, DH ; if dot-heavy CF=1, if dash-heavy CF=0
ENDM
; data table A-Z: MSN = count of dash, LSN = count of dot
TBL DB 011H, 013H, 022H, 012H, 001H, 013H, 021H, 004H, 002H
DB 031H, 021H, 013H, 020H, 011H, 030H, 022H, 031H, 012H
DB 003H, 010H, 012H, 013H, 021H, 022H, 031H, 022H
설명
Intel / MASM 구문에서 8088 호환 명령 만 사용하여 MACRO (기본적으로 함수)로 구현되었습니다. 문자열로 입력하고 캐리 플래그에 Truthy / Falsy 결과를 출력합니다. 점수 표에는 문자 당 대시 수와 도트 수가 포함됩니다.
입력은 대문자입니다. 대소 문자를 구분하려면 2 바이트를 추가하십시오.
테스트 프로그램 예 (IBM PC DOS 독립형 COM 실행 파일로)
SHR SI, 1 ; point SI to DOS PSP
LODSW ; load arg length into AL, advance SI to 82H
MOV CL, AL ; set up loop counter in CH
DEC CX ; remove leading space from letter count
MORSE_DD SI, CX, TBL ; execute above function, result is in CF
MOV DX, OFFSET F ; default output to "Falsy" string
JA DISP_OUT ; if CF=0, result is falsy, skip to output
MOV DX, OFFSET T ; otherwise CF=1, set output to "Truthy" string
DISP_OUT:
MOV AH, 09H ; DOS API display string function
INT 21H
RET
T DB "Truthy$"
F DB "Falsy$"
출력 예 :
테스트 프로그램 DD.COM 다운로드
또는 온라인으로 사용해보십시오!
온라인 TIO가 DOS 실행 파일로 직접 연결되는 것을 알지 못하지만 몇 단계 만 거치면 사용할 수 있습니다.
- DD.COM을 ZIP 파일로 다운로드
- https://virtualconsoles.com/online-emulators/DOS/로 이동 하십시오
- 다운로드 한 ZIP 파일을 업로드하고 시작을 클릭하십시오.
- 타이핑
DD Hello
또는 DD code
마음의 내용