我正在尝试在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来编译程序。
任何帮助将不胜感激,我是新来的,所以请告诉我在编写此问题时是否做错了任何事情。
答案 0 :(得分:0)
一个完美回答您问题的极好资源是:
https://richard.jp.leguen.ca/not-blog/nasm-programming-for-soen228/
NASM像高级语言(C#,JAVA)一样处理字符串转义,但略有不同。将字符串压入寄存器时,请确保添加用于转义的ASCII代码,并添加所需的额外长度。
在该链接中,您可以搜索“我可以使用ASCII码吗?” ,这就是开始处理转义分号的过程的地方。