首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >汇编x86 imul和div没有做我期望的事情

汇编x86 imul和div没有做我期望的事情
EN

Stack Overflow用户
提问于 2020-01-30 20:32:03
回答 2查看 174关注 0票数 0

当我去除法时,它给了我一些来自这个世界的答案。这样做是可行的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mov ax, 11
mov bl, 37
div bl
mov [bAns16], ah

会给出11的正确余数。但一旦我将这些数字转换为变量,整个过程就会中断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mov ax, [bNum1]
mov bl, [bNum4]
div bl
mov [bAns16], ah


;bNum1 = 11
;bNum4 = 37

答案应该是0,剩下的11,但答案最终是104,剩余的3。

而且,我对使用imul有问题--完全没有道理。与div相同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mov ax, 33
mov bx, -17
imul ax, bx
mov [wAns15], ax

会给我正确的答案,但当我把变量放进去的时候,就不会马上给我答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mov ax, [bNum5]
mov bx, [bNum6]
imul ax, bx
mov [wAns15], ax

;bNum5 = 33
;bNum6 = -17

因此,它应该等于-561,但给我-32049,而不是一贯。

我做错了什么?谢谢!

编辑:

以下是数字声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bNum1       db  11
bNum2       db  15
bNum3       db  26
bNum4       db  37
bNum5       db  33
bNum6       db  -17
bNum7       db  -29
bNum8       db  -40
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-30 23:00:04

答案应该是0,剩余的是11,但最终答案是104,其余的是3。

这意味着AXdiv指令之前包含了0x0F0B值,而不是0x000B

张先生的评论暗示了这样做的原因:

与高级编程语言(如C)不同,汇编语言是用来直接告诉CPU该做什么的。

因此,应由程序员来确保数据类型的正确使用。

您的“变量”bNum1只有一个字节长。这将是C编程语言中的unsigned char类型的变量。

然而,指令mov ax, [bNum1]将访问内存中的两个字节值.这等于C中的数据类型unsigned short

此指令将将存储在地址 bNum1中的两个字节和该地址后面的地址解释为一个16位数字。

地址bNum1的字节为11,地址后面的字节(bNum2)为15;这两个字节将被解释为0xF0B

做什么

W. Chang已经建议使用dw而不是db

在C编程语言中,这将使变量bNum1的数据类型从unsigned char更改为unsigned short

但是,您可能不想更改数据类型。

在这种情况下,需要将8位数字转换为16位数字:

对于无符号数字,只需将高8位设置为零即可。

对于有符号的数字,x86 CPU有名为cbw (8到16位)和cwd (16至32位)的指令。不幸的是,这只适用于AX寄存器。

下面的示例演示如何将AL中的8位数字转换为AX中的16位数字。

未签署:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mov al, [bNum1]
mov ah, 0

签名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
; You want to load bNum6 to BX ...
mov al, [bNum6]
cbw
mov bx, ax
; ... and bNum5 to AX
mov al, [bNum5]
cbw
票数 2
EN

Stack Overflow用户

发布于 2020-01-30 22:38:34

AXBX是16位寄存器.mov ax, [bNum1]将从bNum1读取16位(两个字节)。但是由于[bNum1] (0x0B)只有一个字节,所以它也会将[bNum2] (0x0F)作为高字节进行读取。因此,在mov ax, [bNum1] AX之后不是11,而是3851 (0x0F0B)。

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

https://stackoverflow.com/questions/59997884

复制
相关文章
做正确的事情和把事情做正确
事情的选择可以依据“紧急/重要四象限图”,“紧急、不紧急”作为横轴,“重要、不重要”作为竖轴:
春哥大魔王
2023/03/22
5040
做正确的事情和把事情做正确
x86汇编指令详解_x86汇编指令详解
参考链接:X86-assembly/Instructions/lea – aldeid
全栈程序员站长
2022/09/30
1.3K0
我打算这么做巡检方向的事情
巡检的工作其实是比较枯燥和乏味的,在某种程度上,他的工作和监控是有很多交集的,其实在很多公司里面,巡检方向的落地情况其实不容乐观,采用脚本和被动触发的方式效率不高,同时巡检中发现的潜在业务问题和业务部门是隔离的,也就是你在做的事情,业务部门不知道,自然就没法给予充分理解了,所以在问题的处理效率和响应上会是一个黑盒的状态,我觉得这也就是运维方向比较苦逼的一个原因。
jeanron100
2018/10/24
1.1K0
X86汇编语言的分支和控制跳转指令
在使用高级语言例如java,C++,python来编写代码时,我们使用最多的莫过于分支跳转控制语句,例如if..else, switch..case, for()等,本节我们看看这些分支跳转语句如何在X86汇编语言下呈现。
望月从良
2020/11/05
1.9K0
【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | x86 汇编语言分析 )
在上一篇博客 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | 使用 IDA 打开动态库文件 | IDA 中查找指定的方法 ) 中 , 使用 IDA 反编译 Android SDK 中的 D:\001_Develop\001_SDK\Sdk\build-tools\26.0.3\renderscript\lib\intermediates\x86\libc.so 文件 , 并查找其中的 fork 方法 ;
韩曙亮
2023/03/29
1.5K0
【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | x86 汇编语言分析 )
我的期望与痛:SICP
几天前,袁英杰在微信中推荐《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs,SICP)。 他的推荐词说: SICP是一本无论如何都应该去仔细阅读的书。读完它,如果你不是变成了fp的狂热爱好者,而是除了理解fp之外,也更加深刻的理解了OO,logical programming,以及认识到用任何一种方法描述世界都有其局限性,从而放弃对单种范式的狂热(但过程式是个例外,你需要从这个泥潭中越早跳出来越好),那么你才没有白读这本书。 其实
张逸
2018/03/07
1.9K0
我的期望与痛:SICP
对X86汇编的理解与入门
本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令、逻辑计算指令、算数运算指令),以及函数的调用规则。个人认为:在理
Angel_Kitty
2018/04/09
1.9K0
对X86汇编的理解与入门
【Android 逆向】x86 汇编 ( 参考资料 | Intel 官方的文档 | x86 汇编中文文档 | 汇编指令查询器 )
下面的所有资料 , 都可以在博客资源 https://download.csdn.net/download/han1202012/31843542 中下载 ;
韩曙亮
2023/03/29
4950
【Android 逆向】x86 汇编 ( 参考资料 | Intel 官方的文档 | x86 汇编中文文档 | 汇编指令查询器 )
聊聊我在做的事情和思考(有删减)
先来说说我曾思考过的琐碎问题。一线安全团队是否必需安全算法工程师?一线安全团队是否存在工具人的现状?如何持续提升个人和团队核心竞争力?如何平衡自己的成长和带给团队/公司的增益?
蚂蚁安全柳星
2022/10/31
3610
聊聊我在做的事情和思考(有删减)
通过反汇编理解函数调用机制(x86和ARM)
在分析上面的汇编程序之前,需要了解rbp、rsp为栈基址寄存器、栈顶寄存器,分别指向栈底和栈顶;edx、eax、esi、edi均为x86CPU上的通用寄存器,可以存放数据(虽然它们还有别的作用,但是本文章不涉及)
用户7043923
2020/03/12
2K0
使用gui调试x86系统的汇编代码
bochs是一个很好的调试环境首先在liunx系统下下载bochs和bochs-x,前提你的liunx下已经安装好了gdb等调试工具,接下来在写好的asm汇编文件下输入bochs,选择4,输入bochsrc生成相应文件:
gzq大数据
2021/09/22
4440
使用gui调试x86系统的汇编代码
超酷汇编教程-- 简明x86汇编语言教程(1)
大家好,又见面了,我是你们的朋友全栈君。第○章 写在前面 我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了20世纪的历史。与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,而不是和一群人共享一台使用笨重的继电器、开关去操作的巨型机。相比之下,我们的前辈不得不使用机器语言编写程序,他们甚至没有最简单的汇编程序来把助记符翻译成机器语言,而我们可以从上千种计算机语言中选择我们喜欢的一种,而汇编,虽然不是一种“常用”的具有“快速原型开发”能力的语言,却也是我们可以选择的语言中的一种。
全栈程序员站长
2022/06/25
7160
初识Go语言
我仔细回忆了一下,Go竟然是我知道的第一门编译型带GC的语言(IL2CPP不算),这里的编译不是将代码编译成字节码然后解释的那种,是真正编译成能在CPU上执行的native code。
重归混沌
2022/11/11
3750
x86汇编语言之DI和SI寄存器
SI(source index)是源变址寄存器 DI(destination index)是目的变址寄存器 它们和[bx]类似,用于存放偏移地址
乱码三千
2021/08/24
2.2K0
x86汇编语言之8086语法和指令集
上面使用db或者dw定义数据的方式,定义数据的同时就已经定义好了数据所在的物理地址, 如果我们想要从指定的内存地址中写入或者读取数据的话,需要借助段寄存器来实现 在8086中给我们提供了DS SS CS ES四个寄存器,理论上你使用哪一个都行,但是由于系统默认读取DS寄存器中的数据当做段地址,所以我们一般使用DS进行数据的段地址管理
乱码三千
2021/08/24
2.6K0
x86汇编寄存器传参
调用过程中 寄存器 用处 要不要保护 %rax 临时寄存器;参数可变时传递关于 SSE 寄存器 不要 用量的信息;第 1 个返回值寄存器 %rbx 被调者保存的寄存器;或用作基指针
灯珑LoGin
2022/10/31
7250
我期望的Android APP开发方式
其实写了这么多的Android APP后,越发觉得好多代码都是技术含量很低的重复的复制、粘贴,项目上的实现已经越来越没有挑战性和并能激起开发兴趣,那么这些重复的工作是否能在未来的开发中简化并且提升开发质量呢,这可能是我最近在想的问题。
呱牛笔记
2023/05/02
1260
我期望的Android APP开发方式
【Android 逆向】x86 汇编 ( add / sub / mul / div 数值运算指令 | xor / not / sal / sar / shl / shr 位运算指令 )
align 字节对齐 , db 声明字符 / 字符串 , nop 空指令 cmp 比较 , test 比较 call 子函数调用指令 , jmp 跳转指令 ( 可选参数 a , b , c , g , l , o , p , s , z , e , n) lea 加载指令 , lds , les , lfs , lgs , lss , mov 数据传送指令 push 入栈指令 , pop 出栈指令 , pushf , popf , pushd , popd , pushad , popad , pusha , popa ret , retn 返回指令 , set 设置目标值指令 add , sub , mul , div 数值运算指令 xor , not , shl , shr , sal , sar , rol , ror , rcl , rcr 位运算指令
韩曙亮
2023/03/29
1.3K0
J 神提问:除以 2 还是右移 1 ?
我一直在尝试将 AndroidX collection library 移植到 Kotlin multiplatform,来测试二进制兼容性,性能,易用性和不同的内存模型。类库中的一些数据结构使用基于数组实现的二叉树来存储元素。在 Java 代码中有许多地方使用 移位操作 来代替二次幂的乘除法。当移植到 Kotlin 时,这些代码会被转化为略显变扭的中缀操作符,这有点混淆了代码意图。
路遥TM
2021/08/31
1.2K0
x86汇编加载用户程序-4-1
Intel 处理器要求段在内存中的起始物理地址起码是 16 字节对齐的。这句话的意思是,必须是16 的倍数,或者说该物理地址必须能被 16 整除。 所以每个段的定义中都包含了要求 16 字节对齐的子句,所以必须有align=这个设置。align=16那么该段至少是16个字节。
多凡
2021/12/06
6280
x86汇编加载用户程序-4-1

相似问题

Left没有做我期望的事情。

20

RxNet TestScheduler和Windowing没有做我期望的事情

18

Java ForkJoinPool没有做我期望的事情。

10

javascript setTimeout没有做我期望的事情。

61

Python函数没有做我期望的事情。

214
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文