4

在我的汇编语言课上,我们的第一个任务是编写一个程序,在 DOS 中打印出一个简单的以美元结尾的字符串。它看起来像这样:

BITS 32
    global _main

section .data
    msg db "Hello, world!", 13, 10, ’$’

section .text
_main:
mov ah, 9
mov edx, msg
int 21h
ret

据我了解,$ 符号用于终止字符串,就像 C 中的 null 一样。但是如果我想在字符串中添加一个美元符号(比如我想打印出“它花费 30 美元”),我该怎么办?这似乎是一个简单的问题,但我的教授不知道答案,我似乎也没有使用谷歌搜索找到它。

4

7 回答 7

9

您不能使用 DOS 的0x09服务来显示$标志,您需要使用0x02. 见这里

于 2009-01-26T21:16:57.267 回答
3

或者使用未记录的 INT 29h(AL 中的打印字符)制作自己的 print_string 以打印以 NULL 结尾的字符串。

; 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

(假设您使用的是 NASM)

于 2009-01-26T21:35:33.453 回答
3

我更喜欢使用write服务(AH=0x40):

  • AH=0x40
  • BX是文件句柄;使用值 1 写入与服务相同的设备(例如屏幕)AH=9
  • CX是要写入的字节数;数据不是“终止”的(既不是由 NUL 也不是由$),因此可以写入所有值(从 0 到 255)
  • DS:DX指向要写入的数据(在您的情况下:字符串)
    (就像服务一样AH=9;如果您使用 32 位 DOS 扩展:EDX当然)

该服务实际上是用于将数据写入文件;BX但是,它也可用于通过设置为 1将“字符串”写入“输出” 。

于 2020-10-01T16:30:04.667 回答
0

一种方法是找到打印单个字符的调用。你可以用它打印任何字符。分解字符串并打印“it cost”,然后是“$”,最后是“30”。更多的工作,但它完成了工作。

于 2009-01-27T07:35:41.917 回答
-1

您可以使用INT 21H 的02 服务代替09 服务

这是示例。

mov dl, '$'

mov ah,02

int 21h
于 2015-05-25T04:16:25.700 回答
-2

嗯。您可以编写考虑转义的程序集$,例如\$?但是你\也变成了一个特殊的符号,你需要用它\\来打印一个\

于 2009-01-26T21:14:12.483 回答
-5

尝试“$$”、“\044”(八进制)或“\x24”(十六进制)

于 2009-01-26T21:18:47.763 回答