cadenas terminadas en dólares
Pregunta
En mi clase de lenguaje ensamblador, nuestra primera tarea fue escribir un programa para imprimir una cadena simple terminada en dólares en DOS. Se parecía a esto:
BITS 32
global _main
section .data
msg db "Hello, world!", 13, 10, ’$’
section .text
_main:
mov ah, 9
mov edx, msg
int 21h
ret
Según tengo entendido, el signo $ sirve para terminar la picadura como lo hace nulo en C. Pero, ¿qué hago si quiero poner un signo de dólar en la cadena (como si quisiera imprimir " cuesta $ 30 ")? Esta parece una pregunta simple, pero mi profesor no sabía la respuesta y parece que no la encuentro usando una búsqueda en Google.
Solución
No puede usar el servicio 0x09
de DOS para mostrar signos $
, deberá usar 0x02
. Consulte aquí .
Otros consejos
O cree su propia cadena de impresión para imprimir una cadena terminada en NULL utilizando el INT 29h no documentado (carácter de impresión en AL).
; ds:si = address of string to print
print_string:
lodsb ; load next character from ds:si
or al, al ; test for NULL-character
jz .end_of_string ; end of string encountered, return.
int 29h ; print character in AL on screen
jmp print_string ; print next character
.end_of_string:
ret ; return to callers cs:ip
(Suponiendo que está utilizando NASM)
Um. Puede escribir un ensamblaje que se tenga en cuenta para $
escapado, p. \$
?
Pero entonces su \
también se convierte en un símbolo especial, y necesita usar \\
para imprimir un <=>
Una forma es encontrar la llamada que imprime un solo carácter. Puedes imprimir cualquier personaje con eso. Rompa la cadena e imprima & Quot; cuesta & Quot ;, luego el '$', y finalmente, & Quot; 30 & Quot ;. Más trabajo, pero hace el trabajo.
Puede usar el 02 servicio de INT 21H en lugar del 09 servicio .
Aquí está la muestra.
mov dl, '$'
mov ah,02
int 21h
Pruebe '$$', '\ 044' (octal) o '\ x24' (hexadecimal)