解密异或加密


20

您的任务是将加密的字符串作为输入,并输出解密的字符串,以显示其隐藏消息。

输入和输出字符串都将包含以下64个ASCII字符列表中的字符(请注意前导空格):

 !"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~

这些字符按上面列出的顺序分配了编号:

  ! " # $ % &   ...
0 1 2 3 4 5 6   ...

因此,空格是数字0,!数字1和~数字63。这些数字可以用6位二进制代码表示:

 :  0:  000000
!:  1:  000001
":  2:  000010
#:  3:  000011 
.. ...  ......
z: 61:  111101
|: 62:  111110
~: 63:  111111

加密非常简单:

我将使用eC加密字符和C原始字符串的字符。C(n)是原始字符串的eC(n)第n个字符,而是加密字符串的第n个字符。

您将使用字符的6位二进制表示形式。第一个字符为eC(0) = not(C(0))。从那里开始,所有字符均为eC(n) = xor(C(n),C(n-1))

例:

假设输入字符串为code

  • c 是第38个字符(零索引),或者 100110二进制。加密版本的所有位都被翻转,因此011001 -> 25 -> '9'(再次为零索引)。
  • o 是第50个字符,或者 110010二进制。xor(100110, 110010) = 010100 = 20 = '4'
  • d 是第39个字符,或者 100111二进制。xor(100111, 110010) = 010101 = 21 = '5'
  • e是第40个字符或101000二进制。xor(101000, 100111) = 001111 = 15 = '/'

因此,如果原始字符串为code,则加密后的字符串将变为945/


测试用例:

945/
code

,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf

;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com

~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
 !"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~

4
婚姻生活和已经与消息解码?:p
Jonathan Allan

1
@JonathanAllan我多年来一直在解码消息...:P
Stewie Griffin

Answers:


9

果冻27 26字节

ØJḟ“<>`{}”ḟØAɓi@€_33^\96_ị

在线尝试!

备用版本,22字节(无竞争)

果冻终于赶上了其他高尔夫语言,并获得了可打印的ASCII原子,因此现在可以使用了。

ØṖḟ“<>`{}”ḟØAɓi@€’^\Nị

在线尝试!

怎么运行的

ØJḟ“<>`{}”ḟØAɓi@€_33^\96_ị  Main link. Argument: s (string)

ØJ                          Yield Jelly's code page, i.e., 32 non-ASCII characters,
                            followed by all printable ASCII characters, followed by
                            129 non-ASCII characters.
  ḟ“<>`{}”                  Filterfalse; remove the characters "<>`{}".
          ḟØA               Filterfalse; remove all uppercase ASCII letters.
                            Let's call the resulting alphabet a.
             ɓ              Begin a new, dyadic chain.
                            Left argument: s. Right argument: a
              i@€           Find the (1-based) index of all characters of s in a.
                 _33        Subtract 33, so ' ' maps to 0, '~' maps to 63.
                    ^\      Compute the cumulative bitwise XOR.
                            We didn't take the bitwise NOT of the first index,
                            which can be rectified by subtracting all results from
                            63. However, we must also add 33 to account for the
                            fact that the index of ' ' in a is 33.
                      96_   Subtract the results from 96.
                         ị  Index into a.

gh,我在最后几分钟内想到了这一点!可耻的是,我先发布了一个解释:p
乔纳森·艾伦

6

JavaScript(ES6),115个字节

s=>s.replace(/./g,s=>d[x^=d.indexOf(s)],x=63,d=` !"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~`)

测试用例


我认为^去右边]。对于我认为的测试用例,答案仍然适用于该更改。
乔纳森·艾伦,

d从缺少的内容中构造可能会更短?
乔纳森·艾伦,

1
@JonathanAllan也许吧,但是JS有相当长的字符操作方法。在以前的类似挑战中,我没有一个比简单的硬编码字符串短的动态版本,而且这次也没有成功。
Arnauld

我知道这是JavaScript,但看起来根本不像它:S
Slava Knyazev

5

果冻 34  31 字节

-3字节由于丹尼斯(使用两次,而不是œ-;¤;利用”~,而不是63

32r126Ọḟ“<>`{}”ḟØAṙ1ɓ”~;i@€^\Ḋị

用于获取和返回字符列表的单子链接。
*注:输入参数的果冻程序利用Python字符串格式化,有这么报价"''''(或者,如果没有明确的报价)的所有选项。

在线尝试!

怎么样?

按位异或是可逆的(给定“前导零”)。

按位不为“与所有”的异或-在这种情况下,只需要6,因此2 7 -1 = 63

一旦我们创建了一个或多个数组并查找了输入字符的索引,解码本身就简单地是按位异或的累积缩减,之后我们可以索引回到同一数组。

32r126Ọḟ“<>`{}”ḟØAṙ1ɓ”~;i@€^\Ḋị - Main link: string, s
32r126                          - inclusive range -> [32,33,...,125,126]
      Ọ                         - cast to ordinals -> " !...}~"
        “<>`{}”                 - literal ['<','>','`','{','}']
       ḟ                        - filter discard
                ØA              - yield "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
               ḟ                - filter discard
                  ṙ1            - rotate left by one (Jelly indexing is one based)
                    ɓ           - dyadic chain separation, swapping arguments (call that p)
                     ”~         - literal '~'
                       ;        - concatenate with s (`~` has value 63 for the bitwise-not)
                        i@€     - first index* of €ach character of s in p
                            \   - cumulative reduce by:
                           ^    -   bitwise-xor
                             Ḋ  - dequeue (remove the 63 from '~')
                              ị - index into p

* 注意:在p中查找空格会产生64,但这是可以的,因为索引回p是模块化的,因此添加前导1就像添加64,使索引重新回到需要的位置。


3

Java,225个字节

String D(String E){String A="",C=" !\"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~";for(int i=-1,J=0;++i<E.length();J=C.indexOf(E.charAt(i)),A+=C.charAt(i<1?(1<<6)-1-J:C.indexOf(A.charAt(i-1))^J));return A;}

我已经很长时间没有在Java中打高尔夫球了,因此不胜感激。

在线尝试!


我知道已经有一段时间了,但是有些事情要打高尔夫:使用Java 8+ lambda,因此String D(String E){变为E->{(-15字节);-1-J可以是+~J(-1个字节); 并且i=-1可以是i=0++可以将移至i++<1?,然后i-1变为i-2(-1字节)。在线尝试:208个字节
Kevin Cruijssen

2

05AB1E,40个字节

'~«vžQAu"<>{}`"«SK©yk64+b¦S}r.gG^DJC®sè?

在线尝试!

说明

'~«                                       # append input to "~"
   v                                      # for each char y in the resulting string
    žQ                                    # push printable ascii chars
      Au                                  # push upper case alphabet
        "<>{}`"«                          # append "<>{}`"
                SK                        # remove those chars from printable ascii
                  ©                       # store a copy in register
                   yk                     # get the index of y in that string
                     64+                  # add 64
                        b                 # convert to binary
                         ¦S               # remove leading 1 and convert to list of bits
                           }              # end loop
                            r             # reverse stack
                             .gG          # len(stack)-1 times do
                                ^         # xor top 2 lists of bits on the stack
                                 DJC      # convert a copy to decimal
                                    ®sè   # index into the char string with this
                                       ?  # print

2

CPU x86指令集,235个字节

00000750  50                push eax
00000751  8A10              mov dl,[eax]
00000753  80FA00            cmp dl,0x0
00000756  7418              jz 0x770
00000758  31DB              xor ebx,ebx
0000075A  EB03              jmp short 0x75f
0000075C  F9                stc
0000075D  EB13              jmp short 0x772
0000075F  8A83C1A14000      mov al,[ebx+0x40a1c1]
00000765  3C00              cmp al,0x0
00000767  74F3              jz 0x75c
00000769  38C2              cmp dl,al
0000076B  7404              jz 0x771
0000076D  43                inc ebx
0000076E  EBEF              jmp short 0x75f
00000770  42                inc edx
00000771  F8                clc
00000772  58                pop eax
00000773  C3                ret
00000774  53                push ebx
00000775  8B442408          mov eax,[esp+0x8]
00000779  31C9              xor ecx,ecx
0000077B  09C0              or eax,eax
0000077D  7505              jnz 0x784
0000077F  31C0              xor eax,eax
00000781  48                dec eax
00000782  EB2F              jmp short 0x7b3
00000784  E8C7FFFFFF        call 0x750
00000789  72F4              jc 0x77f
0000078B  7510              jnz 0x79d
0000078D  F6D3              not bl
0000078F  80E33F            and bl,0x3f
00000792  88D9              mov cl,bl
00000794  8AB3C1A14000      mov dh,[ebx+0x40a1c1]
0000079A  8830              mov [eax],dh
0000079C  40                inc eax
0000079D  E8AEFFFFFF        call 0x750
000007A2  72DB              jc 0x77f
000007A4  750D              jnz 0x7b3
000007A6  30D9              xor cl,bl
000007A8  8AB1C1A14000      mov dh,[ecx+0x40a1c1]
000007AE  8830              mov [eax],dh
000007B0  40                inc eax
000007B1  EBEA              jmp short 0x79d
000007B3  5B                pop ebx
000007B4  C20400            ret 0x4
000007B7  53                push ebx
000007B8  8B442408          mov eax,[esp+0x8]
000007BC  31C9              xor ecx,ecx
000007BE  09C0              or eax,eax
000007C0  7505              jnz 0x7c7
000007C2  31C0              xor eax,eax
000007C4  48                dec eax
000007C5  EB32              jmp short 0x7f9
000007C7  E884FFFFFF        call 0x750
000007CC  72F4              jc 0x7c2
000007CE  750F              jnz 0x7df
000007D0  30D9              xor cl,bl
000007D2  8AB1C1A14000      mov dh,[ecx+0x40a1c1]
000007D8  8830              mov [eax],dh
000007DA  88D9              mov cl,bl
000007DC  40                inc eax
000007DD  EBE8              jmp short 0x7c7
000007DF  8B442408          mov eax,[esp+0x8]
000007E3  E868FFFFFF        call 0x750
000007E8  72D8              jc 0x7c2
000007EA  750D              jnz 0x7f9
000007EC  F6D3              not bl
000007EE  80E33F            and bl,0x3f
000007F1  8AB3C1A14000      mov dh,[ebx+0x40a1c1]
000007F7  8830              mov [eax],dh
000007F9  5B                pop ebx
000007FA  C20400            ret 0x4

函数find()和deCript()+字符串abc:171字节+ 64字节= 235,使用nasmw进行汇编,使用Borland C编译器编译/库:

; nasmw -fobj  this.asm
; bcc32 -v  this.obj
section _DATA use32 public class=DATA
global _main
extern _printf

fmt1 db "result=%s" , 13, 10, 0, 0
fmt2 db "abc[63]=%c" , 13, 10, 0, 0
code1 db "code" , 0, 0
code2 db ",&'8[14 =?;gp+% 2'@s&&c45/eg8?&" , 0, 0
code3 db ';a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"' , 0, 0
abc db ' !"#$%' , "&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~" , 0, 0

section _TEXT use32 public class=CODE

find:     
      push    eax
      mov     dl,  [eax]
      cmp     dl,  0
      je      .2
      xor     ebx,  ebx
      jmp     short  .1
.e:   stc
      jmp     short  .z
.1:   mov     al,  [abc+ebx]
      cmp     al,  0
      je      .e
      cmp     dl,  al
      je      .3
      inc     ebx
      jmp     short  .1
.2:   inc     edx           ; set zf=0
.3:   clc
.z:   pop     eax
      ret

deCript:  
      push    ebx
      mov     eax,  dword[esp+8]
      xor     ecx,  ecx
      or      eax,  eax
      jnz     .1
.e:   xor     eax,  eax
      dec     eax
      jmp     short  .z
.1:   call    find
      jc      .e
      jnz     .2
      not     bl
      and     bl,  03Fh
      mov     cl,  bl
      mov     dh,  [abc+ebx]
      mov     [eax],  dh
      inc     eax
.2:   call    find
      jc      .e
      jnz     .z
      xor     cl,  bl
      mov     dh,  [abc+ecx]
      mov     [eax],  dh
      inc     eax
      jmp     short  .2
.z:       
      pop     ebx
      ret     4

cript:    
      push    ebx
      mov     eax,  dword[esp+8]
      xor     ecx,  ecx
      or      eax,  eax
      jnz     .1
.e:   xor     eax,  eax
      dec     eax
      jmp     short  .z
.1:   call    find
      jc      .e
      jnz     .2
      xor     cl,  bl
      mov     dh,  [abc+ecx]
      mov     [eax],  dh
      mov     cl,  bl
      inc     eax
      jmp     short  .1
.2:   mov     eax,  dword[esp+8]
      call    find
      jc      .e
      jnz     .z
      not     bl
      and     bl,  03Fh
      mov     dh,  [abc+ebx]
      mov     [eax],  dh
.z:       
      pop     ebx
      ret     4

_main:    
      pushad

      push    code1
      call    cript
      push    code1
      push    fmt1
      call    _printf
      add     esp,  8

      xor     eax,  eax
      mov     al,  [abc+63]
      push    eax
      push    fmt2
      call    _printf
      add     esp,  8

      push    code1
      call    deCript
      push    code1
      push    fmt1
      call    _printf
      add     esp,  8
      push    code2
      call    deCript
      push    code2
      push    fmt1
      call    _printf
      add     esp,  8
      push    code3
      call    deCript
      push    code3
      push    fmt1
      call    _printf
      add     esp,  8

      popad
      mov     eax,  0
      ret

结果:

result=945/
abc[63]=~
result=code
result=programming puzzles & code golf
result=a $150 reward will be given to those sending account and pin# to hackers@steal_id.com

汇编更好(说真的,我使用宏系统,是的,我知道它太长了,但是作为带有宏系统的C one +-,说真的,因为指令更简单,即使不使用汇编也很容易编写代码改正为英文书写(不是I))


2

C(gcc),153字节

char*i=" !\"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~";a(b){b=index(i,b)-i;}f(char*x){for(*x=i[a(*x)^63];x[1];)*x=i[a(*x)^a(*++x)];}

在线尝试!

少打些高尔夫球

char*i=" !\"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~";
a(b){
  b=index(i,b)-i;
}
f(char*x){
  for(*x=i[a(*x)^63];x[1];)
    *x=i[a(*x)^a(*++x)];
}


1

罗达120个 100字节

f a{A=[]seq 32,126|chr _|{|v|A+=v if[v=~"[^<>`{}A-Z]"]}_;l=63;a|{|c|l=indexOf(c,A) b_xor l;[A[l]]}_}

在线尝试!

我使用了l=63JavaScript答案中的技巧。目前,我正在努力缩短起球时间,A以便进行高尔夫运动。


1

Python 2,155个字节

lambda s,m=' !"#$%&\'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~':''.join(m[i]for i in reduce(lambda a,b:a+[a[-1]^b],map(m.find,s),[63])[1:])

在线尝试!


1

PHP,103字节

for($x=63;~$c=$argn[$i++];)echo($a=join(preg_grep("#[^A-Z<>`{}]#",range(" ","~"))))[$x^=strpos($a,$c)];

在线尝试!

PHP,107字节

for($x=63;~$c=$argn[$i++];)echo($a=preg_filter("#[A-Z<>`{}]#","",join(range(" ","~"))))[$x^=strpos($a,$c)];

在线尝试!

PHP,118字节

for($x=63;~$c=$argn[$i++];)echo($a=join(array_diff(range(" ","~"),range(A,Z),str_split("<>`{}"))))[$x^=strpos($a,$c)];

在线尝试!


1

Python + Numpy,214个字节

尽管使用了不同的纯数值方法,但无法与其他Python解决方案竞争:

from numpy import *
def f(s):
    r=range
    A=array
    S=A(r(32,60)+[61,63,64]+r(91,96)+r(97,123)+[124,126])
    T=A(r(128))
    T[S]=A(r(64))
    W=T[fromstring(s,"b")]
    W[0]=~W[0]
    W=S[bitwise_xor.accumulate(W)&63]
    print W.tobytes()[::4]

一点解释:

  • S=A(r(32,60)+...) -将字母定义为代码范围
  • T=A(r(128)) -大小为128(最大代码点)的初始化哈希表
  • T[S]=A(r(64)) -填充哈希表,即将索引0-63写入具有ASCII索引的元素
  • W=T[fromstring(s,"b")] -将输入转换为数组并将其转换为新代码
  • W[0]=~W[0] -反转第一个值
  • W=S[bitwise_xor.accumulate(W)&63] -使用Numpy的xor累加方法来避免循环,重置2个左位并转换回ascii

1

爱丽丝,46字节

/" >"{""ZNr\'?wi.h%)qXq&[.&]?oe(K
\"<~`r}A*"!/

在线尝试!

说明

该程序的前半部分以序数模式运行,并设置从数字到字符的映射。后半部分在基本模式下运行,并使用此映射对输入进行解码。

" ~"                    Push this string
    r                   Convert to entire range (all printable ASCII)
     "AZ"               Push this string
         r              Convert to entire range
          "<>`{}"       Push this string
                 *      Append last two strings
                  N     Remove characters from full string
                   !    Copy entire string to tape

'?                      Push 63 (code point of ?) onto the stack
  w                     Store return address (start main loop)
   i                    Take byte of input
    .h%                 Calculate n mod (n+1): this crashes on EOF (-1)
       )                Find byte on tape
        q               Get position on tape
         X              Bitwise XOR with current value
          q&[           Return to tape position 0
             .&]        Move to tape position corresponding to result of earlier XOR
                ?o      Get and output byte at current tape position
                  e(    Search for -1 to left of current tape position (which will put us at position -1)
                    K   Jump to previously pushed return address.

1

Japt -P,33个字节

;
EkB+"<>}\{`"1
¬i63 åÈ^VaYÃÅm!gV

在线尝试!

由于某种原因,测试用例反对以套件的形式运行,因此分别是第二第三第四项

说明:

;                    #Set E to a string of all printable ASCII characters

Ek          1        #Set V to E with these characters removed:
  B                  # All uppercase letters
   +"<>}\{`"         # and the characters "<>}{`"

¬                    #Turn the input into an array
 i63                 #Add the number 63 to the front of that array
     å     Ã         #Replace each character with:
      È              # The index of the previous decoded character in V
       ^             # Xor with...
        VaY          # The index of the current character in V
            Å        #Remove the extra character
             m!gV    #Map the indexes to the character in V
                     #Join to a string due to the flag

1

APL(NARS),72个字符,144个字节

{r←6⍴2⋄y←{r⊤⍵}¨¯1+⍵⍳⍨s←⎕AV[33..127]∼⎕A,'{<>}`'⋄y[1]←⊂∼↑y⋄s[1+{r⊥⍵}¨≠\y]}

假设输入始终在数组的's中...为了理解解密方法,我必须首先编写汇编版本...测试:

  h←{r←6⍴2⋄y←{r⊤⍵}¨¯1+⍵⍳⍨s←⎕AV[33..127]∼⎕A,'{<>}`'⋄y[1]←⊂∼↑y⋄s[1+{r⊥⍵}¨≠\y]}
  h ,'6'
f
  h '945/'
code
  h ",&'8[14 =?;gp+% 2'@s&&c45/eg8?&"
programming puzzles & code golf
  h ';a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"'
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
  h "~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!"
 !"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~

1

105个 103字节,机器代码(16位x86),57点指示

00000000: ff 01 b9 01 00 89 fa b4 3f cd 21 85 c0 75 02 cd
00000010: 20 8a 05 2c 20 3c 1d 72 1b 48 3c 1e 72 16 48 3c
00000020: 39 72 11 2c 1a 3c 25 72 0b 48 3c 3f 72 06 48 3c
00000030: 40 72 01 48 32 04 24 3f 88 04 3c 3f 72 01 40 3c
00000040: 3e 72 01 40 3c 24 72 01 40 3c 1f 72 02 04 1a 3c
00000050: 1d 72 01 40 3c 1c 72 01 40 04 20 43 89 d9 88 05 
00000060: b4 40 cd 21 4b eb 9b

运行:保存到codegolf.com,dosbox:

codegolf.com < input.bin

差点忘了有趣的部分: 在此处输入图片说明

你好,这是我的第二篇文章。上一个是RC4。使用HT hexeditor完成,无需编译器,但是这次我使用Ctrl-a assemble instruction,无论是否计入条目,我仍然不知道。

为什么和如何

以类似的方式,我首先使用NOPs 创建文件,然后重用了RC4的读/写操作。我首先用python从ASCII到索引的“翻译阶梯”编写。并在组装中使用了它,并在反向上创建了类似的梯子,最后我添加了一个小技巧来处理第一个字节

与RC4相似,最后一步是摆脱其他 nops,这需要修复跳转。

解剖

程序再次依赖于初始寄存器值

00000000 ff01                    inc         word ptr [bx+di]

假人,以后需要

00000002 b90100                  mov         cx, 0x1
00000005 89fa                    mov         dx, di
00000007 b43f                    mov         ah, 0x3f
00000009 cd21                    int         0x21

读取字节

0000000b 85c0                    test        ax, ax
0000000d 7502                    jnz         0x11
0000000f cd20                    int         0x20

如果标准输入完成则退出

00000011 8a05                    mov         al, [di]
00000013 2c20                    sub         al, 0x20
00000015 3c1d                    cmp         al, 0x1d
00000017 721b                    jc          0x34
00000019 48                      dec         ax
0000001a 3c1e                    cmp         al, 0x1e
0000001c 7216                    jc          0x34
0000001e 48                      dec         ax
0000001f 3c39                    cmp         al, 0x39
00000021 7211                    jc          0x34
00000023 2c1a                    sub         al, 0x1a
00000025 3c25                    cmp         al, 0x25
00000027 720b                    jc          0x34
00000029 48                      dec         ax
0000002a 3c3f                    cmp         al, 0x3f
0000002c 7206                    jc          0x34
0000002e 48                      dec         ax
0000002f 3c40                    cmp         al, 0x40
00000031 7201                    jc          0x34
00000033 48                      dec         ax

将ascii转换为索引的梯子(注意所有跳转均转到0x134)

00000034 3204                    xor         al, [si]

与前一个字节的xor或x个字节,SI指向address 0x100,该地址最初在顶部的伪指令的操作码中包含0xFF,这会导致无效行为(提醒:COM加载为0x100)

00000036 243f                    and         al, 0x3f
00000038 8804                    mov         [si], al

将结果限制为索引,并将字节存储在0x100处,

0000003a 3c3f                    cmp         al, 0x3f
0000003c 7201                    jc          0x3f
0000003e 40                      inc         ax
0000003f 3c3e                    cmp         al, 0x3e
00000041 7201                    jc          0x44
00000043 40                      inc         ax
00000044 3c24                    cmp         al, 0x24
00000046 7201                    jc          0x49
00000048 40                      inc         ax
00000049 3c1f                    cmp         al, 0x1f
0000004b 7202                    jc          0x4f
0000004d 041a                    add         al, 0x1a
0000004f 3c1d                    cmp         al, 0x1d
00000051 7201                    jc          0x54
00000053 40                      inc         ax
00000054 3c1c                    cmp         al, 0x1c
00000056 7201                    jc          0x59
00000058 40                      inc         ax
00000059 0420                    add         al, 0x20

反向梯

0000005b 43                      inc         bx
0000005c 89d9                    mov         cx, bx
0000005e 8805                    mov         [di], al
00000060 b440                    mov         ah, 0x40
00000062 cd21                    int         0x21
00000064 4b                      dec         bx

将字节放在[di]下,将字节写入stdout(注意AH = 40h使用DX作为地址,但是在读取字节时将其设置在顶部)

注意,使用din bx / dec bx完成stdin-> stdout和stdout到stdin的操作

00000067 eb99                    jmp         0x2

循环^^

工具和资源

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.