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

Posted

技术标签:

【中文标题】在汇编 (MASM) 中显示字符串的偶数字符【英文标题】:Displaying the even characters of a string in Assembly (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. 【参考方案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 中,通过将字符串终止测试放在循环底部附近并执行一次只跳转到它,避免了重复无条件跳转。

【讨论】:

以上是关于在汇编 (MASM) 中显示字符串的偶数字符的主要内容,如果未能解决你的问题,请参考以下文章

在汇编代码 (MASM) 中的字符串中查找子字符串的更好形式?

汇编 MASM 字符串比较

使用 masm 将简单字符串写入控制台(汇编代码)

MASM6.15汇编程序

需要帮助使用 masm 以 80x86 汇编语言连接两个字符串

汇编语言——实验八