x86 - Assembly,sub和imul不起作用

时间:2016-12-28 10:52:22

标签: assembly x86

程序计数结果减法或乘法取决于指定的最后一个参数(例如:“./a.out 2 4 - ”= -2;“./a.out 5 8 x”= 40)。如果最后一个参数是' - '或'x',程序不会在屏幕上打印任何内容。为什么???

std::multimap<int,std::string> mymap;
mymap.emplace(1, "hello ");
mymap.emplace(1, "world!");
std::cout << mymap.size() << "\n";

1 个答案:

答案 0 :(得分:2)

现在我也检查了你的来源,它没有做任何有意义的事情。您不了解所收到的参数格式,也不了解int 80h, 4(sys_write)的参数格式。

mov ecx, dword ptr [esp+8]

加载指向<OS encoding>字符串的指针(可能是UTF-8,因此只要涉及数字,就可以将其视为ASCII)。

如果您确实输入了./a.out 12 23456 -,那么ecx将指向字符串31 32 00的第一个字节(六个字节形成nul终止"12")并且dword ptr [esp+12]是字符串的地址由字节32 33 34 35 36 00组成。

所以你是SUB / IMUL-ing两个地址。

然后对于sys_write,您应该在ebx中给出文件处理程序(1 == stdout,在代码中正确),edx是要写入的缓冲区长度,{{1是缓冲区的地址。

如果要产生类似&#34; -23444&#34;的输出,则必须在内存中准备ASCII字节(hexa)ecx,并将带有地址的2D 32 33 34 34 34加载到第一个字节ecx2D或45(十进制))和'-' edx来显示此类字符串。

也许你可能想先用字符串播放而不必进行字符串 - >数字和数字 - >字符串转换?或链接clib,因此您可以调用6函数族来处理这些参数并准备输出。

(在printf/scanf中没有使用&#34;数字&#34;的服务调用,只支持字节缓冲区(您可以将它们视为&#34;字符串&#34;,虽然它不准确)。