在x86 NASM中向字符串添加分号?

时间:2018-09-26 18:36:52

标签: assembly x86 nasm

我正在尝试在NASM中创建一个x86程序集宏,该宏使用ANSI转义码将光标移动到用户终端窗口中的指定X Y坐标。代码是:

; MoveCursor    X,      Y
segment     .data
format:
    db  `\033[%d;%dH` ; First %d is Y coordinate, second %d is X coordinate
                      ; Backticks tell NASM to process these as C-Strings
                      ; Semicolon seperates the Y and X values.
%macro  MoveCursor  2
        lea     rdi,    [rel format]
        lea     rsi,    [rel %2]
        lea     rcx,    [rel %1]    ; ANSI move cursor code is in Y, X format, hence reversing parameters
                                    ; to provide more traditional X,Y format.
        call    _printf ; Print the ANSI code to move the cursor.
        ; printf should have printed something like "\033[1;5H" at this point
%endmacro

您可能已经看到我的问题了。 NASM使用Intel语法,其中“;”标志着评论的开始。因此,NASM认为“格式”中第一个分号之后的所有内容均为注释。因此,宏将更改Y坐标,但不会更改X坐标,因为x坐标应移到的位置已用printf格式注释掉了。我试过了,但是(据我所知。我不是ANSI代码专家)ANSI转义代码需要用分号分隔两个数字,我不能使用空格。

有什么办法可以解决这个问题?在NASM认为这不是评论的情况下,如何正确地在“ \ 033 [%d;%dH””中获取该分号?当然,我可以编写一个C ++程序来执行此操作并将其与我的汇编程序链接,但是我更喜欢在汇编中进行。

我正在运行Mac OSX,并且正在使用x86汇编语言进行编程。我正在使用NASM和GCC来编译程序。

任何帮助将不胜感激,我是新来的,所以请告诉我在编写此问题时是否做错了任何事情。

1 个答案:

答案 0 :(得分:0)

一个完美回答您问题的极好资源是:

https://richard.jp.leguen.ca/not-blog/nasm-programming-for-soen228/

NASM像高级语言(C#,JAVA)一样处理字符串转义,但略有不同。将字符串压入寄存器时,请确保添加用于转义的ASCII代码,并添加所需的额外长度。

在该链接中,您可以搜索“我可以使用ASCII码吗?” ,这就是开始处理转义分号的过程的地方。