Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 关于在终端上读取系统调用期间光标移动的问题_Assembly_Terminal_X86 64_Nasm_Yasm - Fatal编程技术网

Assembly 关于在终端上读取系统调用期间光标移动的问题

Assembly 关于在终端上读取系统调用期间光标移动的问题,assembly,terminal,x86-64,nasm,yasm,Assembly,Terminal,X86 64,Nasm,Yasm,我对汇编相当陌生,我正在关注一些在google/youtube()上找到的教程 我试着自己飞,编写自己的小程序,但很明显,在学习教程的过程中,它并没有按照原来的方式运行;) 我试图理解为什么我没有得到预期的输出,以及如何调试以了解我的错误在哪里/是什么 我正在使用: -yasm 1.3.0 -Ubuntu 18.04.3 LTS(仿生海狸) 我使用以下选项进行编译: yasm -Worphon-labels -g dwarf2 -f elf64 <my_file.asm> -l my

我对汇编相当陌生,我正在关注一些在google/youtube()上找到的教程
我试着自己飞,编写自己的小程序,但很明显,在学习教程的过程中,它并没有按照原来的方式运行;)
我试图理解为什么我没有得到预期的输出,以及如何调试以了解我的错误在哪里/是什么

我正在使用: -yasm 1.3.0 -Ubuntu 18.04.3 LTS(仿生海狸)

我使用以下选项进行编译:

yasm -Worphon-labels -g dwarf2 -f elf64 <my_file.asm> -l my_file.lst
ld -g -o my_file my_file.o
我期望得到以下结果:

Number One ? <waiting for input> ; when provided, next line
Number Two ? <waiting for input> ; when provided, next line
<program exit>
第一名;提供时,请单击下一行
二号?;提供时,请单击下一行
但我得到了以下信息:

Number One ? <waiting for input> ; say we type in 1
Number Two ? 1
_cursor is now here_             ; say we type in 1
<program exit>
第一名;假设我们输入1
二号?1.
_光标现在在这里;假设我们输入1
几乎没有什么事情让我困惑:
-如果我没有在两个字符串显示之间提供0xA,为什么会有新行?
-为什么第二个提示上出现“1”,为什么光标在第三行?
-我如何调试exec以找出发生了什么事?

我尝试使用edb GUI。我不知道如何设置断点/步进,但我不知道我在寻找什么以及在哪里?
我也尝试了经典的gdb,但我不知道如何获得一些调试信息,除了“运行,下一步,下一步,下一步…程序完成”


(如果你想知道,我纯粹是好奇地学习汇编!下一步是C:D)

当你运行这个程序时,输入连接到终端(而不是从文件或其他东西重定向),终端仍然处于“echo”模式,由内核提供行编辑。因此,用户键入的换行符会影响光标

当我运行它时,在输入1两次后,终端中的最终结果将显示为enter:

如果我使用control-D“提交”文本(因此read将返回),而不键入换行符,则输出如下所示:

peter@volta:/tmp$ ./foo 
Number One ? 1Number Two ? 1peter@volta:/tmp$ 
要了解更多关于这方面的信息,请使用google POSIX TTY和终端输入


调试:

对于GDB,使用
layout reg
在单步执行时显示寄存器。您还可以运行
strace./my_程序
来跟踪系统调用。有关调试技巧,请参见的底部

Strace输出,用
-o
记录到文件中,因此不会与实际终端输出混淆:

peter@volta:/tmp$ strace -o foo.tr ./foo 
Number One ? 1
Number Two ? 1
peter@volta:/tmp$ cat foo.tr
execve("./foo", ["./foo"], 0x7fffbac22f80 /* 54 vars */) = 0
write(1, "Number One ? \0", 14)         = 14
read(0, "1\n", 8)                       = 2
write(1, "Number Two ? \0", 14)         = 14
read(0, "1\n", 8)                       = 2
exit(0)                                 = ?
+++ exited with 0 +++

请注意,提示中包含一个
0
字节。在终端中,它打印为零宽度,但这仍然是一个坏主意<代码>写入采用指针+长度,可处理任意二进制字节。您应该省略终止零,因为您有显式长度字符串。

我不确定我是否理解。当键入“1+ENTER”时,即向终端传递信息,以便传递1和0xA,但如何将其追加到第二个字符串的末尾?看看strace,我的第二次写入与你的完全不同:
write(1,“第二个数字是什么?\32\0\0\0”…,6291948)=2048
关于输出,我想我的.asm文件中有一些垃圾。我删除了它,复制/粘贴了上面的代码,重新编译/链接,它工作得很好。。。我假设我做错了什么,但看不到:)@Hunkerjr:strace输出显示您在RDX中传递了一些巨大的垃圾值(
6291948
),作为
写入的长度,所以实际上您在第一次
写入时同时打印了两条消息。除非那只是第二次提示?它返回2048,因为可能在该点到达页面的末尾,而下一个页面未映射。你的问题根本不清楚实际印刷的是什么。您问题中的代码没有bug,在使用YASM复制/粘贴和组装时可以工作。不管怎样,这就是为什么
strace
非常有用的原因之一。非常感谢。请问,你能给我指出一些好的文档来学习吗?很明显,我所要做的就是提示输入2个数字,然后执行算术运算,然后显示结果。我对要使用的变量大小、位、字节和寄存器感到非常困惑。有4个小时的夜晚(6个月大的女儿!),时间崩溃,明天继续;)@Hunkerjr:用更高级的语言(如C)来思考这个任务,或者用抽象的方式来思考数据的处理步骤。然后寻找可以用来构建的指令或系统调用。或者用C或C++写,并查看编译器输出提示。针对您的具体情况:有一个关于多位数的部分。看见
peter@volta:/tmp$ ./foo 
Number One ? 1Number Two ? 1peter@volta:/tmp$ 
peter@volta:/tmp$ strace -o foo.tr ./foo 
Number One ? 1
Number Two ? 1
peter@volta:/tmp$ cat foo.tr
execve("./foo", ["./foo"], 0x7fffbac22f80 /* 54 vars */) = 0
write(1, "Number One ? \0", 14)         = 14
read(0, "1\n", 8)                       = 2
write(1, "Number Two ? \0", 14)         = 14
read(0, "1\n", 8)                       = 2
exit(0)                                 = ?
+++ exited with 0 +++