2015-09-28 42 views
0

我正在使用NASM在SASM IDE中編寫以下程序。我有一個變量m沒有被改變只讀(現在)。在div操作之後以某種方式,它看起來像米變化的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 

(預期)輸出:

Lab_2 Start: 
Testing: 6... 
DEBUG: 15 
DEBUG: 6 

回答

2

問題是你已經聲明所有變量爲單詞(16位),但不斷讀寫32位寄存器。

您需要:

  1. 改變你的變量聲明從DWDD(雙字)。
  2. 訪問變量時,使用16位寄存器,如ax,bx,cx等。

您還可以將16位值擴展爲32位,例如, movsx ebx,word [m]。但是這隻在從內存中讀取時纔有意義。

+0

從小型寄存器移動到大型寄存器時,我認爲它是相關的。 –