以美元结尾的字符串

时间:2009-01-26 21:06:37

标签: assembly console dos nasm

在我的汇编语言类中,我们的第一个任务是编写一个程序,在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美元” )?这似乎是一个简单的问题,但我的教授不知道答案,我似乎没有使用谷歌搜索找到它。

7 个答案:

答案 0 :(得分:8)

您无法使用DOS的0x09服务来显示$个符号,您需要使用0x02。请参阅here

答案 1 :(得分: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)

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

庵。您可以编写将为转义$考虑的程序集,例如\$? 但是,您的\也会成为特殊符号,您需要使用\\来打印\

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

以下是样本。

mov dl, '$'

mov ah,02

int 21h

答案 6 :(得分:-3)

尝试'$$','\ 044'(八进制)或'\ x24'(十六进制)