2016-12-05 64 views
0

所以我正在学习程序集,我写了一个程序来总结我在'data_type'中定义的值。装配初学者:设置一个变量等于DCD中的值的数量?

大气压我有手动设置变量“NUM”等于值的“DATA_TYPE”的数量,以确保环总结它们。

我想知道是否有更好的方法来做到这一点?

或者,如果有声明变量“民”动态地承担起“DATA_TYPE”值量的方法吗?

在此先感谢!

AREA Sum loop, CODE, READONLY 
ENTRY 
num EQU 5 
Reset_Handler 
LDR r1, =data_values 
MOV r5,#num  
loop 
LDR r2,[r1],#4 
ADD r3,r3,r2 
SUBS r5,r5,#1  
BNE loop 

data_values 
ALIGN 4 
DCD 1, 1, 1, 1, 1 ; example values 
END 
+1

不确定你的汇编程序,但:1)如果'data_values'没有对齐会发生什么?如果它与其他汇编程序的工作方式类似,data_values符号将具有未对齐的地址值,而DCD将定义对齐的数据,因此您的代码将对错误的数据字节进行非对齐访问。我相信你应该交换这两个,首先对齐,然后定义符号标签。 2)'BNE'后会发生什么?或者你只是在调试器中运行它,不要让它超出你定义的代码? – Ped7g

+0

好的,谢谢,现在就换掉它们。使用Keil工具。 我只是在调试器中运行它到BNE,因为它只是一个学习练习,你有什么建议如何实现我以上要求的? – ohkneel

回答

1

我想知道是否有这样做的更好的办法?

意见基础......太阔。如何构建数据有多种方法,每种方法都适合不同情况下的用户。我会尝试列出所有主要的(我打赌我会忘记一些)。

编译时间:

  • 你做了什么
  • 在数据的开始不仅定义标签,而且在数据的末尾,然后从它们的区别,你可以以字节为单位计算长度(如果汇编没有按” t支持基本表达式,这可能需要运行时计算)。
  • 许多汇编程序都支持基本表达式,而不是定义结束标签,实际上你可以做一些类似于num equ (($ - start_label)/4)的地方,其中$是某些汇编器(可能不是你的,这是x86 TASM/MASM示例)中的当前地址。
  • 元件和阵列尺寸完全永远固定的(即“组15串,每5个字符长” => 75个字​​节正好和代码写入仅支持 - 可能不是在现实世界中非常有用,除了一些HW-有限的角落案例......或快速聚焦学习练习,重点关注不同的事物,其中固定数组无关紧要)。

运行:在这种方式

  • 写代码的函数调用程序必须支持阵列不仅地址,而且它的大小(非常通用的API风格,你通常可以弯曲的任何其他结构数据要被这样的API处理,尽管使用值终止的数组可能不是最佳的效率,因为你必须首先计算大小) - 这将结构问题委托给调用者,并不能自行解决。
  • 使用一些值作为终结,就像ASCII ž字符串值为0结束。
  • 使用数据的一些结构,例如C++ std::vector,其中所述内部数据结构不仅包含指针存储器,还单独的变量来存储载体(以及多个其他变量的大小围绕最后一个分配的分配的内存和大小的容量保持等等。检查任何std::vector执行得到的想法),在你的情况下,你可能会举例为最简单的DCD 5, 1, 1, 1, 1, 1(第一个字是大小,然后数据跟着)。
  • 其他任何你能想到的..一些现实世界的例子是各种交织结构,例如旧EGA 16彩色图形模式中的分离位平面,其中一组存储器每像素存储一位,并且绘制一个像素,必须切换通过所有四个存储体,写入每个特定的位值。你几乎可以创造任何东西,你可以充分的数学定义和编写它的代码。
相关问题