- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
谁能告诉我以十进制格式显示寄存器中值的纯汇编代码?请不要建议使用 printf hack,然后使用 gcc 进行编译。
描述:
好吧,我对 NASM 进行了一些研究和一些实验,并认为我可以使用 c 库中的 printf 函数来打印一个整数。我通过使用 GCC 编译器编译目标文件来做到这一点,一切正常。
然而,我想要实现的是将存储在任何寄存器中的值以十进制形式打印。
我做了一些研究,发现 DOS 命令行的中断向量 021h 可以显示字符串和字符,而 2 或 9 在 ah 寄存器中,数据在 dx 中。
结论:
我找到的所有示例都没有显示如何在不使用 C 库的 printf 的情况下以十进制形式显示寄存器的内容值。有谁知道如何在 assembly 中做到这一点?
最佳答案
你需要写一个二进制到十进制的转换例程,然后用十进制数字产生“数字字符”来打印。
您必须假设某处某物会在您选择的输出设备上打印一个字符。调用这个子程序“print_character”;假设它在 EAX 中接受一个字符代码并保留所有寄存器。(如果你没有这样的子程序,你会有一个额外的问题,它应该是另一个问题的基础)。
如果您在寄存器(比如 EAX)中有一个数字的二进制代码(例如,一个 0-9 的值),您可以通过添加“零”字符到寄存器。这很简单:
add eax, 0x30 ; convert digit in EAX to corresponding character digit
然后您可以调用 print_character 来打印数字字符代码。
要输出任意值,您需要选择数字并打印出来。
提取数字基本上需要使用 10 的幂。使用 10 的一次幂是最简单的,例如 10 本身。想象一下,我们有一个除以 10 的例程,它在 EAX 中取一个值,在 EDX 中产生一个商,在 EAX 中产生一个余数。我把它留作练习,让您了解如何实现这样的例程。
然后一个具有正确想法的简单例程是为该值可能具有的所有数字生成一个数字。一个 32 位寄存器存储 40 亿的值,所以你可能会打印 10 位数字。所以:
mov eax, valuetoprint
mov ecx, 10 ; digit count to produce
loop: call dividebyten
add eax, 0x30
call printcharacter
mov eax, edx
dec ecx
jne loop
这行得通...但会以相反的顺序打印数字。哎呀!好吧,我们可以利用下推堆栈来存储生成的数字,然后以相反的顺序将它们弹出:
mov eax, valuetoprint
mov ecx, 10 ; digit count to generate
loop1: call dividebyten
add eax, 0x30
push eax
mov eax, edx
dec ecx
jne loop1
mov ecx, 10 ; digit count to print
loop2: pop eax
call printcharacter
dec ecx
jne loop2
留给读者作为练习:取消前导零。此外,由于我们正在将数字字符写入内存,而不是将它们写入堆栈,我们可以将它们写入缓冲区,然后打印缓冲区内容。也留给读者作为练习。
关于assembly - 如何在没有 c 库中的 printf 的情况下在汇编级编程中打印整数? (itoa,整数到十进制的 ASCII 字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57227410/
这听起来像是一个愚蠢的问题......但我在任何地方都找不到 strconv.Itoa 中的“a”实际上代表什么。如果它取一个整数并把它变成一个字符串,为什么这个函数不叫 Itos? 最佳答案 整数到
赏金:对于提供代码以使此子程序与负数一起工作的任何人,+50 信誉点。 我编写了一个 MIPS 程序来将华氏温度转换为摄氏温度。它打开自己的输出窗口(即 UART)并正确显示摄氏值。它在从 C 调用到
也许不是一个真正重要的问题,但只是从 c 开始。为什么这不能正确编译? #include #include void main() { int i = 15; char word[100]; it
我正在尝试在汇编(网络汇编器)中实现atoi。我通过使用调试器检查寄存器值来验证我的方法是有效的。问题是应用程序在即将退出时会崩溃。我担心我的程序正在以某种方式破坏堆栈。我链接到 GCC stdlib
我希望我的函数“ordenafile”采用candidatos.000 - candidatos.068。由于某种原因,我认为 si[0] 有问题,因为如果我让程序打印 si[0],它就会崩溃。有人知
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
为什么这会给我一个内存错误? char* aVar= new char; itoa(2, aVar, 10); delete aVar; itoa 是否删除了 aVar?如何知道 C++ 函数是否删除
代码先行: template void do_sth(int count) { char str_count[10]; //... itoa(count, str_count
好的,所以我试图让我的 itoa_base.c 返回一个字符串,并在另一个函数中创建一个字符串 *str 并将指向该字符串的引用指针发送到我执行转换的函数,但是当我尝试打印时它检查它,我只得到字符串的
我一直在尝试编写一个递归版本的函数itoa,代码如下所示。 void itoa(int n, char s[]) { static int i = 0; if(n / 10 !=
我正在将一些旧的 c 程序转换为更安全的版本。以下功能被大量使用,谁能告诉我他们的安全对应物? Windows 函数或 C 运行时库函数。谢谢。 itoa() getchar() strcat() m
我目前正在调用 _itoa_s,然后调用 strlen 来计算写入了多少个字符。是否有与 itoa 类似的方法,要么返回指向缓冲区开头的新指针,要么返回写入了多少个字符?我无法在标准库中找到提供此功能
我目前正在调用 _itoa_s,然后调用 strlen 来计算写入了多少个字符。是否有与 itoa 类似的方法,要么返回指向缓冲区开头的新指针,要么返回写入了多少个字符?我无法在标准库中找到提供此功能
如果我包含 stdlib.h,那么 itoa() 也不会被识别。我的代码: %{ #include "stdlib.h" #include #include int yylex(void); ch
我试图重写 K&R 练习中的 itoa() 函数,但未能定义它。我在库中看到函数的答案,但我无法理解 do block 中的内容。请向我解释一下。谢谢! /* itoa: convert n to
我的程序仅输出非零数字...例如输入= 16076,输出= 1676 ...任何人都可以帮忙数学 #include char *ft_itoa(int n) { int cou
我被分配了实现 itoa 的任务,但我的代码不适用于 -2147483648。我怎样才能让它发挥作用? char *itoa(int nbr) { static char rep[] =
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 3 年前。 Improv
我想知道是否有一种方法可以使用字符串化编译器指令来字符串化整数变量。我尝试使用: #define stringize(a) #a #define h(a) stringize(a) #define g
背景 我正在尝试确定一些国家变音字母的字符代码。 问题 我的代码有问题吗? char a = "a"; // "a" ascii code is 97 char buffer[8]; itoa(buf
我是一名优秀的程序员,十分优秀!