在汇编 (MASM) 中显示字符串的偶数字符

Displaying the even characters of a string in Assembly (MASM)

我想打印出一个字符串的偶数个字符。到目前为止,我得到了这段代码(这段代码打印出整个字符串):

.MODEL SMALL
.STACK
.DATA
    adat DB "Test test",0
.CODE
main proc
    MOV AX, DGROUP
    MOV DS, AX
    LEA BX, adat
    new:
        MOV DL, [BX] 
        OR DL, DL 
        CALL WRITE_CHAR
        JZ stop 
        INC BX
        JMP new
    stop: 
        MOV AH,4Ch ;Kilépés 
        INT 21h
main endp

write_char proc                                 
  PUSH  AX                  
  MOV   AH, 2               
  INT   21h                 
  POP   AX                  
  RET                       
write_char endp

END main

到目前为止,我已经能够到达那里。我之前尝试过一些东西,但它们没有用。

OR DL, DL 
CALL WRITE_CHAR
JZ stop 

CALL WRITE_CHAR returns 时,OR DL, DL 指令中定义的标志将消失!所以循环可能没有 运行 所需的次数。

字符串中的偶数字符是什么 ?

  • 它是位于字符串中偶数偏移量的字符吗?
main proc
    mov  ax, DGROUP
    mov  ds, ax
    xor  bx, bx       ; (*)
    jmp  char
  next:
    inc  bx           ; The sought for EVEN offset just became ODD here ...
    test bx, 1
    jz   char         ; ... so using opposite condition to skip
    mov  ah, 02h      ; DOS.WriteChar
    int  21h
  char:
    mov  dl, adat[bx] 
    test dl, dl
    jnz  next

    mov  ax, 4C00h    ; DOS.Terminate
    int  21h
main endp
  • 是否是字符串中第 2、4、6、... 位置的字符,所以在奇数偏移处?
main proc
    mov  ax, DGROUP
    mov  ds, ax
    xor  bx, bx       ; (*)
    jmp  char
  next:
    inc  bx           ; The sought for ODD offset just became EVEN here ...
    test bx, 1
    jnz  char         ; ... so using opposite condition to skip
    mov  ah, 02h      ; DOS.WriteChar
    int  21h
  char:
    mov  dl, adat[bx]
    test dl, dl
    jnz  next

    mov  ax, 4C00h    ; DOS.Terminate
    int  21h
main endp
  • 还是ASCII码为偶数的字符?
main proc
    mov  ax, DGROUP
    mov  ds, ax
    xor  bx, bx
    jmp  char
  next:
    inc  bx
    test dl, 1        ; Testing ASCII
    jnz  char         ; Skip on ODD code
    mov  ah, 02h      ; DOS.WriteChar
    int  21h
  char:
    mov  dl, adat[bx] 
    test dl, dl
    jnz  next

    mov  ax, 4C00h    ; DOS.Terminate
    int  21h
main endp

(*) 我们可以从寻址字符串的地址寄存器开始工作,而不是使用额外的寄存器来测试均匀性。

在这些代码片段中,通过将字符串终止测试放在循环底部附近并执行一次性跳转,避免了重复无条件跳转。