mã máy x86 trên DOS - 14 13 11 byte
Vâng, nó đã trở nên ngắn hơn một lần nữa! Sau khi viết một giải pháp cho một thách thức không liên quan , tôi nhận thấy rằng thủ thuật tương tự có thể được áp dụng ngay cả ở đây. Vì vậy, ở đây chúng tôi đi:
00000000 b4 08 cd 21 35 01 0a 86 c2 eb f7 |...!5......|
0000000b
Nhận xét lắp ráp:
org 100h
section .text
start:
mov ah,8 ; start with "read character with no echo"
lop:
; this loop runs twice per character read; first with ah=8,
; so "read character with no echo", then with ah=2, so
; "write character"; the switch is performed by the xor below
int 21h ; perform syscall
; ah is the syscall number; xor with 0x0a changes 8 to 2 and
; viceversa (so, switch read <=> write)
; al is the read character (when we did read); xor the low
; bit to change 0 to 1 and reverse
xor ax,0x0a01
mov dl,al ; put the read (and inverted character) in dl,
; where syscall 2 looks for the character to print
jmp lop ; loop
Giải pháp trước đây - 13 byte
Tôi nghĩ nó không ngắn hơn thế này nhiều.Thật ra, nó đã làm! Cảm ơn @ninjalj vì đã loại bỏ thêm một byte.
00000000 b4 08 cd 21 34 01 92 b4 02 cd 21 eb f3 |...!4.....!..|
0000000d
Phiên bản này có tính tương tác nâng cao ™ - sau khi chạy nó từ dòng lệnh, nó sẽ tạo ra các ký tự "đảo ngược" miễn là bạn viết các chữ số đầu vào (không được lặp lại); để thoát, chỉ cần thực hiện Ctrl-C.
Không giống như giải pháp trước đây, điều này có một số sự cố khi chạy trong DosBox - vì DosBox không hỗ trợ Ctrl-C chính xác , bạn buộc phải đóng cửa sổ DOSBox nếu bạn muốn thoát. Trong một VM với DOS 6.0, thay vào đó, nó chạy như dự định.
Nguồn NASM:
org 100h
section .text
start:
mov ah,8
int 21h
xor al,1
xchg dx,ax
mov ah,2
int 21h
jmp start
Giải pháp cũ - 27 25 22 byte
Điều này chấp nhận đầu vào của nó từ dòng lệnh; chạy trơn tru như một tệp .COM trong DosBox.
00000000 bb 01 00 b4 02 8a 97 81 00 80 f2 01 cd 21 43 3a |.............!C:|
00000010 1e 80 00 7c f0 c3 |...|..|
Đầu vào NASM:
org 100h
section .text
start:
mov bx, 1
mov ah, 2
loop:
mov dl, byte[bx+81h]
xor dl, 1
int 21h
inc bx
cmp bl, byte[80h]
jl loop
exit:
ret