รหัสเครื่อง x86, 9 7 ไบต์
D1 E9 SHR CX, 1 ; divide length in half
AD LODSW ; load next two chars into AH/AL
3A E0 CMP AH, AL ; compare AH and AL
E1 FB LOOPE -5 ; if equal, continue loop
สายป้อนในความยาวสายเข้าในSI
CX
เอาท์พุทZF
ถ้าเป็นคู่พูด
หรือ14 ไบต์เป็น PC DOS ที่สามารถใช้งานได้ทั้งหมด:
B4 01 MOV AH, 01H ; DOS read char from STDIN (with echo)
CD 21 INT 21H ; read first char into AL
92 XCHG DX, AX ; put first char into DL
B4 08 MOV AH, 08H ; DOS read char from STDIN (no echo)
CD 21 INT 21H ; read second char into AL
3A C2 CMP AL, DL ; compare first and second char
74 F3 JE -13 ; if the same, continue loop
C3 RET ; otherwise exit to DOS
อินพุตคือผ่านSTDIN
ท่อหรือแบบโต้ตอบ จะสะท้อนอินพุต "de-doubled" จนกว่าจะตรวจพบอักขระที่ไม่เพิ่มเป็นสองเท่า ณ จุดนั้นจะออก (อาจดัดกฎ I / O นิดหน่อย แต่นี่เป็นเพียงคำตอบโบนัส)
สร้างและทดสอบ ISDBL2.COM โดยใช้xxd -r
:
00000000: b401 cd21 92b4 08cd 213a c274 f3c3 ...!....!:.t..
Original DOS ขนาด 24 ไบต์สมบูรณ์สำหรับ PC DOS:
D1 EE SHR SI, 1 ; SI to DOS PSP (080H)
AD LODSW ; load string length into AL
D0 E8 SHR AL, 1 ; divide length in half
8A C8 MOV CL, AL ; put string length into BL
CLOOP:
AD LODSW ; load next two chars into AH/AL
3A E0 CMP AH, AL ; compare AH and AL
E1 FB LOOPE CLOOP ; if equal, continue loop
DONE:
B8 0E59 MOV AX, 0E59H ; BIOS tty function in AH, 'Y' in AL
74 02 JZ DISP ; if ZF, result was valid double
B0 4E MOV AL, 'N' ; if not, change output char to N
DISP:
B4 0E MOV AH, 0EH
CD 10 INT 10H
C3 RET ; return to DOS
อินพุตจากบรรทัดรับคำสั่งเอาต์พุตไปยังหน้าจอ'Y'
หากเป็นสองเท่า'N'
หากไม่ใช่
สร้างและทดสอบ ISDBL.COM โดยใช้xxd -r
:
00000000: d1ee add0 e88a c8ad 3ae0 e1fb b859 0e74 ........:....Y.t
00000010: 02b0 4eb4 0ecd 10c3 ..N.....
เครดิต:
- -2 ไบต์ขอบคุณไปที่ @ErikF!