处理负整数的汇编 MASM

2024-04-19

我被指示用汇编语言编写一个程序,该程序将执行以下算术:

((A + B) / C) * ((D - A) + E)

当没有负值发挥作用时,我成功地做到了这一点,但假设 A = 5、B = 4、C = 3、D = 2 和 E = 1。这给了我们 ((5 + 4) / 3 ) * ((2 - 5) + 1) 或 -6。

这就是我需要帮助的地方。我做了一些研究,发现 2 的赞美是一个解决方案,但我不确定是否将其实现到我的代码中。

如果有人可以帮助我,我将非常感激!



INCLUDE Irvine32.inc
; ((A + B) / C) * ((D - A) + E)
.data
valA dword 1
valB dword 2
valC dword 3
valD dword 4
valE dword 5

.code
main PROC

    mov ecx, valA
    add ecx, valB
    mov edx, valC
    call Divide
    mov ecx, eax
    mov edx, valD
    sub edx, valA
    add edx, valE
    call Multiply

    exit

main ENDP
  

*除法和乘法程序分别进行除法和乘法。


尔湾的WriteDec http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fwritedec.htm应替换为WriteInt http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fwriteint.htm它处理参数EAX作为签名号码。

在CPU内部,负数“-2”和正数“4294967294”被转换为相同的值:0xFFFFFFFE。DIV http://x86.renejeschke.de/html/file_module_x86_id_72.html正向执行除法 6/-2 (6/4294967294) 并得到结果 0 = 0x00000000,其中IDIV http://x86.renejeschke.de/html/file_module_x86_id_137.html结果是正确的:-3 = 0xFFFFFFFD。

MUL http://x86.renejeschke.de/html/file_module_x86_id_210.html and IMUL http://x86.renejeschke.de/html/file_module_x86_id_138.html结果的高部分不同(EDX)。由于在这种情况下不需要高部分,因此不强制使用IMUL http://x86.renejeschke.de/html/file_module_x86_id_138.html.

没有不同的版本ADD http://x86.renejeschke.de/html/file_module_x86_id_5.html and SUB http://x86.renejeschke.de/html/file_module_x86_id_308.html对于有符号和无符号的数字。这是引入2的补码编码的主要原因。这只是一个解释:如果程序员决定这应该是一个有符号数,那么它就是一个有符号数。如果他/她/它决定这是一个无符号数,那么它就是一个无符号数。 CPU 不关心这些事情——结果总是一样的。

这是一个例子WriteInt http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fwriteint.htm, IDIV http://x86.renejeschke.de/html/file_module_x86_id_137.html and IMUL http://x86.renejeschke.de/html/file_module_x86_id_138.html:

; ((A + B) / C) * ((D - A) + E)
INCLUDE Irvine32.inc

.DATA
valA dword 5
valB dword 4
valC dword 3
valD dword 2
valE dword 1

.CODE
main PROC
    mov ecx, valA
    add ecx, valB
    mov edx, valC
    call Divide

    mov ecx, eax
    mov edx, valD
    sub edx, valA
    add edx, valE
    call Multiply

    call WriteInt           ; Write a positive or negative number

    exit
main ENDP

Divide PROC USES ECX EDX    ; EAX = ECX / EDX
    mov eax, ecx
    mov ecx, edx
    xor edx, edx
    idiv ecx                ; Signed division, e.g 6/-3 = -2
    ret
Divide ENDP

Multiply PROC USES ECX EDX  ; EAX = ECX * EDX
    mov eax, edx
    imul ecx                ; Signed multiplication
    ret
Multiply ENDP

END main

需要进行 2 的补码计算才能获得数字的绝对值。例如。 -2 的表示有两部分:符号('-')和绝对值('2')。获取绝对值的一个简单方法是查看符号位(数字的最左边的位),然后进行适当的跳转。计算本身仅通过以下方式执行NEG http://x86.renejeschke.de/html/file_module_x86_id_216.html.

示例为WriteDec http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fwritedec.htm, IDIV http://x86.renejeschke.de/html/file_module_x86_id_137.html and IMUL http://x86.renejeschke.de/html/file_module_x86_id_138.html:

; ((A + B) / C) * ((D - A) + E)
INCLUDE Irvine32.inc

.DATA
valA dword 5
valB dword 4
valC dword 3
valD dword 2
valE dword 1

.CODE
main PROC
    mov ecx, valA
    add ecx, valB
    mov edx, valC
    call Divide

    mov ecx, eax
    mov edx, valD
    sub edx, valA
    add edx, valE
    call Multiply

    test eax, eax           ; Set the flags according to (EAX AND EAX)
    jns J1                  ; Skip the next block if EAX is positive (no sign)

        ; EAX is negative
        push eax            ; Preserve EAX
        mov al, '-'         ; Write the letter '-'
        call WriteChar      ; http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fwritechar.htm
        pop eax             ; Restore EAX
        neg eax             ; 2's complement

    J1:
    call WriteDec           ; Write EAX as positive number

    exit
main ENDP

Divide PROC USES ECX EDX    ; EAX = ECX / EDX
    mov eax, ecx
    mov ecx, edx
    xor edx, edx
    idiv ecx                ; signed division, e.g 6/-3 = -2
    ret
Divide ENDP

Multiply PROC USES ECX EDX  ; EAX = ECX * EDX
    mov eax, edx
    imul ecx                ; signed multiplication
    ret
Multiply ENDP

END main

下面是一个无需跳转即可获取 EAX 绝对值的算法:

cdq
xor eax, edx
sub eax, edx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理负整数的汇编 MASM 的相关文章

  • gcc 如何知道内联汇编中使用的寄存器大小?

    我有内联汇编代码 define read msr index buf asm volatile rdmsr d buf 1 a buf 0 c index 使用该宏的代码 u32 buf 2 read msr 0x173 buf 我发现反汇
  • 汇编语言中的全局_start是什么?

    这是我的汇编级代码 section text global start start mov eax 4 mov ebx 1 mov ecx mesg mov edx size int 0x80 exit mov eax 1 int 0x80
  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour
  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • 为什么当设置为 TLS 选择器时,ES 和 DS 在 64 位内核上最终会归零?

    下面的 32 位程序调用set thread area 2 http linux die net man 2 set thread area在 GDT 中创建一个条目 该条目旨在用于 TLS 通常将结果选择器放入FS or GS并成功使用
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中?

    我仍然没有找到为什么最低的有符号负数没有等效的有符号正数的原因 为简单起见 我的意思是 3 位二进制数 100 是 4 但我们不能有符号格式的正 4 因为我们不能 它溢出了 那么我们如何知道补码 1000 是 4 1000 0000 是 1
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 在 x86 程序集中将整数打印到控制台

    当我在 16 位汇编中添加两个值时 将结果打印到控制台的最佳方法是什么 目前我有这个代码 CODE START mov ax 1 put 1 into ax add ax 2 add 2 to ax current value mov ah
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 内联 asm 中不支持的指令“mov”将控制寄存器移动到 uint32_t

    我在 C 函数中使用汇编代码 但海湾合作委员会给出unsupported instruction mov 以下代码的错误 uint32 t faulting address asm volatile mov cr2 0 r faulting
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L

随机推荐

  • R 中函数的运算符重载 - 奇怪的行为

    不幸的是像这样的事情 f g 3 其中 f 和 g 都是一元函数 在 R 中不起作用 因此 我尝试通过以下方式重载一元函数的 运算符 function function e1 e2 return function x e1 x e2 x 但
  • Git - 进一步重新合并

    合并与变基的主要缺点是合并会导致树混乱 如果 master 经常被更新 那么每次有重大更新时合并 mastery 将创建大量不必要的提交 现在 大多数时候 实际上没有任何必要 考虑存储库如下 Master A B C D E Branch
  • Gitlab代码审查批量评论?

    在Gitlab中进行代码审查时是否可以获取批量注释 与 Phabricator 类似 当审阅者对您的代码进行多条评论时 您只会收到一封电子邮件 我们正在尝试在工作中使用 Gitlab 但感觉每条评论的单独电子邮件都像垃圾邮件一样 Thank
  • 启动服务的小部件也会启动主要活动

    我有一个应该启动和停止服务的小部件 在不运行时启动它 在运行时停止它 这工作正常 但是 每次启动服务时 我的应用程序的主要活动也会启动 这是我不想要的 如果我删除 MAIN intent filter
  • 如何在 Laravel 4 中注册命名空间

    问题 PostController php 中第 4 行未找到类 PostRepostioryInterface 或者在修改命名空间时我什至得到了类 找不到应用 模型 接口 PostRepositoryInterface 问题 如何在 la
  • C# - 优雅的列表分区方式?

    我想通过指定每个分区中的元素数量将列表分区为列表列表 例如 假设我有列表 1 2 11 并且希望对其进行分区 使每个集合都有 4 个元素 最后一个集合填充尽可能多的元素 生成的分区将类似于 1 4 5 8 9 11 怎样写才是优雅的方式呢
  • 将通用列表转换为特定类型

    我有一个包含一些值的列表 Example List testData new List testData Add new List aaa bbb ccc testData Add new List ddd eee fff testData
  • 触发器 - 是否有必要 BEGIN / COMMIT TRAN

    我想像这样创建 INSTEAD OF 触发器 CREATE TRIGGER dbo DeleteCompany ON dbo Company INSTEAD OF DELETE AS DECLARE CompanyID int SELECT
  • FacebookRequest::execute() 未包含在 facebook sdk 中

    下载后facebook 的 php sdk https github com facebook facebook php sdk v4 archive 5 0 0 zip我试图运行下列的 https developers facebook
  • 类“属性”与“成员”与“变量”与“字段”的术语[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 似乎开发人员在引用存储在类实例中的数据时经常互换使用这些术语 每个术语之间是否存在技术差异 或者可以互换使用它们吗 根据不同的答案 类
  • 为什么带有子模块和名称冲突的函数的模块可以工作?

    这是我想知道的代码 mod a pub mod b pub fn b println b pub use self b b use a b fn main b b b 为什么b b 工作 模块不应该吗b和函数b冲突 这是否意味着a b不知何
  • 如何在 igraph R 中创建自循环?

    如何添加self loop除了改变之外的图表Adjacency matrix这正在改变c i i 1 有没有一个函数可以做到这一点igraph R包裹 Edit 图形创建 network read csv file choose netwo
  • pyaudio 可以同时演奏两个音符吗?

    可以使用 pyaudio 演奏和弦吗 当然 只需生成结果并将其传递给玩家即可 本文介绍了一种实现此目的的方法 http davywybiral blogspot com br 2010 09 procedural music with py
  • FMDB ios 没有这个表

    我正在做的 sqlite 项目有问题 我正在使用 FMDB 我遵循一个简单的示例 但不起作用 而且我找不到错误 我从终端创建了数据库模式 并在上面放置了一些数据 我对 ios 开发非常陌生 所以我不知道我是否正确执行了这些步骤 这就是我所做
  • Tkinter - 窗口焦点丢失事件

    是否有事件触发tkinter窗口失去可以绑定到的焦点tkinter窗口使用 bind method 您正在寻找的活动是
  • r 中的循环问题: if (length[i] == 1) { 中的错误:缺少 TRUE/FALSE 需要的值

    ann lt 1 2500 len lt sample 1 3 1000 replace TRUE df lt data frame col1 c 1 2500 col2 c 1 2500 for i in 1 length ann if
  • 运行包含 Pipes 的命令行并将结果显示到 STDOUT

    如何从 Python 调用包含管道的 shell 命令并捕获输出 假设命令类似于 cat file log tail 1 我想做的 Perl 等效项是这样的 my string cat file log tail 1 使用 subproce
  • 构建 nspredicate 时的 EXC_BAD_ACCESS

    我正在计算生日和今天之间的月数 利用这个数字 我正在构建一个谓词来从核心数据中获取对象 尽管月数计算正确 如日志所示 但在构建谓词时我得到了 EXC BAD ACCESS 这是我的代码 NSCalendar gregorian NSCale
  • 隐藏网站文件夹/目录文件的最佳方法是什么[重复]

    这个问题在这里已经有答案了 如果我通过 www mysite com img 访问我的网站 我会看到以下内容 父目录 folder1 folder2 file1 file2 等等等等 但什么是best如何阻止人们访问我的网站文件夹和文件结构
  • 处理负整数的汇编 MASM

    我被指示用汇编语言编写一个程序 该程序将执行以下算术 A B C D A E 当没有负值发挥作用时 我成功地做到了这一点 但假设 A 5 B 4 C 3 D 2 和 E 1 这给了我们 5 4 3 2 5 1 或 6 这就是我需要帮助的地方