在汇编 (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
(*) 我们可以从寻址字符串的地址寄存器开始工作,而不是使用额外的寄存器来测试均匀性。
在这些代码片段中,通过将字符串终止测试放在循环底部附近并执行一次性跳转,避免了重复无条件跳转。
我想打印出一个字符串的偶数个字符。到目前为止,我得到了这段代码(这段代码打印出整个字符串):
.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
(*) 我们可以从寻址字符串的地址寄存器开始工作,而不是使用额外的寄存器来测试均匀性。
在这些代码片段中,通过将字符串终止测试放在循环底部附近并执行一次性跳转,避免了重复无条件跳转。