Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86程序集新手:基本添加和存储数字问题

x86程序集新手:基本添加和存储数字问题
EN

Stack Overflow用户
提问于 2012-03-26 11:12:18
回答 1查看 6.3K关注 0票数 0

你好,我是新来的装配,我正在努力得到一个两部分的程序来工作。对于此x86程序集,我使用Visual。

第一部分)我的第一个目标是数到13,在路上把每个值加起来。前任,0+1+2+3...+13=91.我想把总数全部储存起来。

第二部分,我要用2^0到2^6的幂数,x,0,1,2,4,8,32,64。我想,我正在这么做,但我并不是在储存每一种价值。我想将这些存储在连续的内存位置中。

到目前为止我有这个,

代码语言:javascript
运行
AI代码解释
复制
.586
.MODEL FLAT

.STACK 4096

.DATA
num1 BYTE 13          ;Initialize number to count to
totall BYTE 0         ;Total of all counted numbers
temp BYTE 0           ;Temp for loop adding

shiftme BYTE 1        ;Start of counting 2^0 so I can reach 2^6

.CODE
main PROC
;code here

increment:            ;Increment label
inc temp              ;Increment temp by 1
mov eax, temp
add totall, eax       ;Add temp+totall and store in totall
cmp eax, num1         ;Compare for jump
jne increment         ;Jump if not equal

;this part should store each value 1,2,4,8,32.. in consecutive memory locat
shiftallthethings:    ;Shift label
shl shiftme, 1        ;Shifting bits to the left one
cmp shiftme, 64       ;Comparing for the jump
jne shiftallthethings ;Jump if not equal to

ret
main ENDP
END

能帮我理解的问题。

  • 如何在连续的内存位置存储值?
  • 是否正确地使用跳转和标签指令?
  • 是否需要使用eax之类的特定寄存器来执行这些问题?为什么?

任何帮助都是非常感谢的,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-26 12:54:27

首先,在回答你们的问题时:

如何在连续内存位置存储值?

在MASM32中,您可以直接执行像mov sum_addr, eax这样的mov (只要数据类型具有相同的大小),也可以传递数据指针。在我编写的示例中,指向total的指针被传递给函数。然后,该函数将一个值写入该指针所指向的内存(即total的内容)。不太清楚连续的内存位置是什么意思。如果你是指指针运算,我也可以给你举一个例子。

我正确地使用了跳转和标签指令吗?

是的,那似乎很好。我使用的另一种方法是匿名标签。这是适当的,当标签是琐碎和相当接近。这是个人喜好。如果你觉得标签名称更合适,也可以随意使用。

,我需要使用像eax这样的特定寄存器来执行这些问题吗?为什么?

MASM32遵循Win32 (stdcall)的调用约定,所以这样做对您也有好处。在寄存器保存方面,这意味着除了eaxecxedx之外,所有函数都需要保存寄存器,这些功能被认为是可传输的。如果需要超过4个字节,则返回值存储在eaxeaxedx中。

就您编写的代码而言,您遇到了一些问题,例如试图将不同大小的数据类型相互移动。例如,如果将byte移动到dword中,则必须首先将其扩展为相同的大小。

代码语言:javascript
运行
AI代码解释
复制
mov eax, temp

这将不会编译,因为temp只有1字节长,而eax只有4字节。你可以做的是:

代码语言:javascript
运行
AI代码解释
复制
movzx eax, temp

在移动之前,这个零扩展的temp。下面是一些我拼凑在一起的代码,可能会教你一些东西。它使用宏(不确定您是否还想学习这些宏),但其他方面演示了传递和返回值的惯用MASM32参数。

代码语言:javascript
运行
AI代码解释
复制
include \masm32\include\masm32rt.inc

.DATA

total DWORD 0         ;Total of all counted numbers

.CODE

; takes in address of total and writes the value there
sum PROC sum_addr:DWORD

xor eax, eax
xor ecx, ecx

  @@:
inc ecx
add eax, ecx
cmp ecx, 13
jnz @b

mov edx, sum_addr
mov dword ptr ds:[edx], eax
print ustr$(eax), 13, 10

mov edx, sum_addr
mov eax, dword ptr ds:[edx]
ret

sum ENDP

start:

push offset total          ; pass address of total
call sum
print ustr$(eax), 13, 10   ; demonstrating how to use return values

print ustr$(total), 13, 10 ; testing result got stored properly
ret

end start
END

代码没有被优化,但是应该很容易理解。注意我是如何尽可能多地使用寄存器的(如果我们有足够的寄存器,这比经常处理内存更有效)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9878241

复制
相关文章
为什么是AUC值而不是GSEA来挑选转录因子呢
通过学习,我们知道这个RcisTarget包内置的motifAnnotations_hgnc是16万行,可以看到每个基因有多个motif。而且下载好的 hg19-tss-centered-10kb-7species.mc9nr.feather 文件,也是 24453个motifs的基因排序信息。但是我们留下来了一个悬念,如何从几万个注释结果里面挑选到最后100个富集成功的motif呢?
生信技能树
2020/12/03
1.3K0
为什么是AUC值而不是GSEA来挑选转录因子呢
为什么 C# 的 string.Empty 是一个静态只读字段,而不是一个常量呢?
使用 C# 语言编写字符串常量的时候,你可能会发现可以使用 "" 而不能使用 string.Empty。进一步可以发现 string.Empty 实际上是一个静态只读字段,而不是一个常量。
walterlv
2020/02/10
1.1K0
innodb为什么选择B+ Tree而不是跳表,Redis为什么选择跳表而不是B+ Tree
链表和数组相比,数组可以通过下标快速定位,或者通过二分查找,查询复杂度为O(logn),而链表只能按照顺序挨个查找,复杂度为O(n)。
大忽悠爱学习
2023/03/23
2.5K0
innodb为什么选择B+ Tree而不是跳表,Redis为什么选择跳表而不是B+ Tree
js判断list的某一个值是不是存在
最近更新博客的频率确实是慢了很多,主要是事情比较多,确实也没时间更新。今天相对有点时间,所以简单记录一下一个比较常见的问题。
何处锦绣不灰堆
2020/05/29
2.5K0
面试题46:为什么Redis使用SDS而不是C字符串?
【说明】最后一位遵循C字符串的空字符('\0')结尾的规则,目的是,可以直接使用C字符串的函数。其中len计数不包含‘\0’。
爪哇缪斯
2023/05/09
2920
面试题46:为什么Redis使用SDS而不是C字符串?
Java处理包含引号的String字符串
背景 在开发默认提示文字时: 解决方案 转义 使用\"代替" 效果 正常
JavaEdge
2021/02/22
1.8K0
Java处理包含引号的String字符串
为什么建议你用nullptr而不是NULL?
在C语言中,我们常常用NULL作为指针变量的初始值,而在C++中,却不建议你这么做。
编程珠玑
2019/08/28
9.6K0
为什么建议使用你 LocalDateTime ,而不是 Date?
多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat对象 => 创建和销毁对象的开销大 - 对使用format和parse方法的地方进行加锁 => 线程阻塞性能差 - 使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象 => 较好的方法
芋道源码
2019/10/23
1.6K0
JDBC为什么要使用PreparedStatement而不是Statement
前言 这篇博客不是我写的,是由刘志军大大翻译的,真心觉得很棒,而且是必学要掌握的东西,所以就转载过来了,我个人的第一篇转载文章。 开始 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时Prepar
roobtyan
2018/06/04
1.5K0
为什么特征工程要用 SQL 而不是 Python
我们常说机器学习是一门实验科学。所以相比较传统工程而言,机器学习分成两个大的阶段:
用户2936994
2022/05/18
8610
为什么特征工程要用 SQL 而不是 Python
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。下面是一个例子:
哲洛不闹
2018/09/19
9780
JDBC为什么要使用PreparedStatement而不是Statement
为什么我会选择 React 而不是 Vue?
你注意到我过于圆滑的标题了吗?我将依据我所喜欢的方式去构建这个对话,而不是我客观上认为的唇枪舌战。我想后者并不会起作用。
疯狂的技术宅
2019/03/27
1.4K0
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。下面是一个例子:
哲洛不闹
2018/09/19
1.1K0
JDBC为什么要使用PreparedStatement而不是Statement
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还经常会在Java面试被提及,譬如:Statement与PreparedStatement的区别以及如何避免SQL
java达人
2018/01/31
3.8K0
为什么建议使用你LocalDateTime,而不是Date?
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?
良月柒
2019/10/28
1.5K0
为什么建议使用你LocalDateTime,而不是Date?
为什么建议使用你 LocalDateTime ,而不是 Date?
来源:juejin.im/post/5d7787625188252388753eae
JAVA葵花宝典
2019/10/29
1.1K0
为什么建议使用你 LocalDateTime ,而不是 Date?
来源:juejin.im/post/5d7787625188252388753eae
用户1516716
2019/10/24
1.1K0
为什么建议你使用LocalDateTime而不是Date?
calendar是共享变量,并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat】调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。parse方法实际调用alb.establish(calendar).getTime()方法来解析,alb.establish(calendar)方法里主要完成了
Bug开发工程师
2020/03/12
2.1K0
为什么是int main()而不是void main()
这是基于我们学校老师一直使用void main(),而发的感慨,大一学习C语言时,我就在想,老师上课演示的为什么一直用void main(),而不是int main()呢?不为了偷懒?还是习惯性的语句呢?在查阅了部分大牛的博客,翻阅了C Primer Plus和C++ Primer Plus这两本圣经级别的书本之后,得出以下结论(有一部分是别人的结论,属于半转载),可能不太严谨,请多多包涵。
对弈
2019/09/04
3.7K0
为什么 url 通常使用域名而不是 IP 地址?
大家好,我是前端西瓜哥。今天来谈谈为什么我们的网址,通常是使用域名,而不是 IP 地址。
前端西瓜哥
2022/12/21
1.8K0

相似问题

从HTML表中获取数据更新MySQL数据库

20

从表中更新数据

14

更新表数据,从另一个表中获取

33

如何从包含要更新的基表中的数据的联接表中获取数据?

20

如何从XML中获取数据并更新数据库表

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档