2009-01-26 87 views
3

在我的汇编语言课程中,我们的第一项任务是编写一个程序在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.但是,我该怎么办终止刺痛,如果我想要把一个美元符号的字符串(如我想打印出“它需要30美元”)?这看起来像一个简单的问题,但我的教授不知道答案,我似乎没有找到它使用谷歌搜索。

回答

7

不能使用DOS的0x09服务以显示$迹象,你将需要使用0x02。见here

+1

看起来0x40的应该工作以及:http://www.uv.tietgen.dk/staff/mlha/PC/Prog/asm/int/21/40.htm – 2009-01-26 21:26:31

+0

或者,你可以使用0x40,但是这要求你指定要写入的字节数(即它不使用分隔字符串)。 – 2009-01-26 21:26:33

+0

@Jason - 嘿,打我一秒钟。 :-) – 2009-01-26 21:27:49

0

嗯。您可以编写汇编,以考虑转义的$,例如\$? 但随后你\成为一个特殊符号过了,你需要使用\\打印\

-3

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

3

或使自己的print_string使用无证INT 29H(打印字符的打印NULL结束的字符串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 

(假设你使用NASM)

0

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

0

您可以使用INT 21H的02服务而不是09服务

下面是示例。

mov dl, '$' 

mov ah,02 

int 21h