【问题标题】:How to make a register overflow using variables in Assembly Language如何使用汇编语言中的变量使寄存器溢出
【发布时间】:2015-09-10 18:31:16
【问题描述】:

我正在学习汇编语言 (x86),我需要弄清楚如何仅使用变量而不是中间值来使寄存器溢出。

我通过将 FFFF 放入变量中来溢出 AX 寄存器,将该变量移动到 AX,然后递增 AX。但是,我遇到了问题。首先,我去声明一个WORD 变量,如下所示:

limitReg WORD 0

然后在.code我这样做:

MOV limitReg, FFFFh
MOV ax, limitReg

但是,我收到以下错误:

Error   1   error MSB3721: The command "ml.exe /c /nologo /Zi     /Fo"Debug\pa2.obj" /Fl"PA2.lst" /I "C:\Irvine" /W3 /errorReport:prompt  /Ta..\..\..\..\..\..\..\Irvine\Examples\ch03\pa2.asm" exited with code 1. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\masm.targets 50

有人可以帮我学习这个吗?

【问题讨论】:

  • 控制台中没有更多的错误信息吗?一些指向无法汇编的实际代码行。
  • @Michael Nope。我得到的唯一消息是声明的消息。
  • 在 masm 中,您从像 mov ax, [limitReg] 这样的内存加载,它从 地址加载 - 而不是仅仅加载地址本身。此外,您的第一条指令根本不存在。你不能在不涉及寄存器的情况下移动值。
  • 汇编器应该已经生成了一个文件PA2.lst(考虑到命令行选项/F1)。请查看该文件的内容;它应该提供有关装配过程中出现问题的完整详细信息。
  • @BoPersson mov ax, [limitReg] 是 NASM 语法(或理想模式下的 TASM); MASM 不接受括号。而MOV memory,immediate 从最初的 8086 开始就一直是有效的指令。如果我错了,请纠正我。

标签: visual-studio-2012 assembly x86 overflow masm


【解决方案1】:

“中间值”是吧?您指的是“立即”吗?内存位置是中间值。直接使用它们 (inc [myvar]) 通常不是一个好主意。内存用于长期存储变量,或者当您用完寄存器并需要溢出一个时。

撇开术语不谈,我想我知道你想做什么(出于某种原因使用 16 位 asm):

section .data
myvar: dw 0FFFFH     ; 2 bytes of storage intialized to -1

section .text
GLOBAL asmfunction
asmfunction:
    ;mov ax, myvar   ; ax = address of myvar
    mov ax, [myvar]  ; ax = contents of myvar
    inc ax
    mov [myvar], ax  ; store back to the global variable
    ret

实际上,在 MASM 语法(而不是 NASM)中,mov ax, myvar 可能仍然是负载,而不是带有地址的 mov-immediate。如果您想要加载/存储,将其始终写为[addr] 绝对是一个好主意。如果要地址,you can use mov ax, offset myvar,比lea ax, [myvar]效率高

另外,更简单地说:

xor ax, ax   ; zero ax (but not eax)
dec ax       ; unsigned carry from from 0 to 0xffff.
             ;  However, dec doesn't touch CF, only the other flags

谈论“溢出”无符号值很常见,但请记住,指令根据unsigned carry (between 0 and 0xff...) and signed overflow (between MIN_INT and MAX_INT) 设置 x86 进位和溢出标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多