在汇编 (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
放在OR
和JZ
之间是个坏主意。
@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) 中的字符串中查找子字符串的更好形式?