Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 内存值在运行时更改,无需执行写入操作_Assembly_Nasm - Fatal编程技术网

Assembly 内存值在运行时更改,无需执行写入操作

Assembly 内存值在运行时更改,无需执行写入操作,assembly,nasm,Assembly,Nasm,我正在使用NASM在SASM IDE中编写以下程序。我有一个变量m,它没有被改变,只是读取(现在)。在div操作之后,看起来m从6变为983046 以下是完整的.asm代码: ; TO COMPILE: ; nasm -f elf -g -F stabs lab.asm -l lab.lst ; gcc -m32 lab.o -o lab global main extern printf SECTION .data m DW 6 ; Number being check for perf

我正在使用NASM在SASM IDE中编写以下程序。我有一个变量m,它没有被改变,只是读取(现在)。在div操作之后,看起来m从6变为983046

以下是完整的.asm代码:

; TO COMPILE:
; nasm -f elf -g -F stabs lab.asm -l lab.lst
; gcc -m32 lab.o -o lab

global main
extern printf

SECTION .data

m DW 6 ; Number being check for perf median
t DW 0 ; Sum of preceeding numbers
n DW 0 ; Sum of suceeding numbers
d DW 0.5

SECTION .text

main:
; Safe registers are EBX, EBP, ESI, EDI, and ESP.
; Formula to find 1-6 (including the number 6

push message
call printf
add esp, 4

mov ebx, [m]
; Test print variable
push ebx
push dataM ; Needed to format the value as "%d"
call printf
add esp, 8

; Calculate T
mov ebx, [m]
mov edi, [m]
dec ebx

imul ebx, edi
mov [t], ebx

mov ax, [t]
mov bl, 2
div bl


mov [t], ax ; Done Calculating t
mov ebx, [t] 

push ebx
push dataM2 ; Needed to format the value as "%d"
call printf
add esp, 8

; This Doesn't work?
mov ebx, [m] ; Value of m has seemingly changed??

push ebx
push dataM2 ; Needed to format the value as "%d"
call printf
add esp, 8



ret


message:
db "Lab_2 Start:", 10,0

dataM:
db "Testing: %d...", 10, 0

dataM2:
db "DEBUG: %d", 10, 0
输出:

Lab_2 Start:
Testing: 6...
DEBUG: 15
DEBUG: 983046
(预期)产出:


问题是,您已经将所有变量声明为字(16位),但您一直在读写32位寄存器

您需要:

  • 将变量声明从
    DW
    更改为
    DD
    (双字)
  • 访问变量时,请使用16位寄存器,如
    ax
    bx
    cx

  • 您还可以将16位值扩展为32位,例如
    movsx ebx,word[m]
    。但这只是从内存中读取时的相关问题。

    当从一个较小的登记册移动到一个更大的寄存器时,我会认为这是相关的。
    Lab_2 Start:
    Testing: 6...
    DEBUG: 15
    DEBUG: 6