【问题标题】:Displaying the even characters of a string in Assembly (MASM)在汇编 (MASM) 中显示字符串的偶数字符
【发布时间】:2021-11-13 13:31:22
【问题描述】:

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

.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

到目前为止,我已经能够到达那里。我之前尝试过一些方法,但没有成功。

【问题讨论】:

  • 至少显示其中一项不起作用的事情 :) 描述你的逻辑。 PS:将CALL 放在ORJZ 之间是个坏主意。
  • @Jester 我这样尝试过:创建了一个 CX 寄存器并加 1。我不知道这是否可能,但不知何故我想知道 CX 是否为奇数,然后如果是偶数则打印字符。
  • 是的,也可以。你在哪里卡住了。另一种方法是简单地将BX 增加 2,但随后也要小心检查奇数地址处的终止零。
  • 我一直纠结于如何检查 CX 是否为偶数。
  • 通常的方法是简单地检查最低有效位,例如test cx, 1.

标签: assembly x86 masm


【解决方案1】:
OR DL, DL 
CALL WRITE_CHAR
JZ stop 

CALL WRITE_CHAR 返回时,从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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多