asm 新手,所以这可能是显而易见的,但是 - 这是代码的相关部分:
localX equ [bp-4]
localY equ [bp-6]
localZ equ [bp-8]
mov ax, [bp+4]
mov localX, ax
mov ax, [bp+6]
mov localY, ax
mov ax, [bp+8]
mov localZ, ax
当我编译并运行它时,模拟器似乎将 localX/Y/Z 变量解释为 [bp] +00h,而不是 [bp] -04h。我尝试用实际值替换局部变量(因此不是 mov localX,而是 mov [bp-4])并且它工作正常,但我仍然不知道我做错了什么。 对于上下文,这是整个代码:
org 100h
.data
.code
.start
mov ax, @data
mov ds, ax
xor ax, ax
push 6
push 8
push 3
call xyz
xyz proc
push bp
mov bp, sp
push ax
sub sp, 6
localX equ [bp-4]
localY equ [bp-6]
localZ equ [bp-8]
mov ax, [bp+4]
mov localX, ax
mov ax, [bp+6]
mov localY, ax
mov ax, [bp+8]
mov localZ, ax
add sp, 6
pop ax
pop bp
ret 6
endp xyz
jmp exitL
exitL:
.exit
谢谢:)
如果您使用正常编码而不是
localX
、localY
和 localZ
一切正常。
mov ax, [bp+4] ; ax = 3
mov [bp-4], ax ; bp = fff4 - 4 = fff0, [fff0] = 3
mov ax, [bp+6] ; ax = 8
mov [bp-6], ax ; bp = fff4 - 6 = ffee, [ffee] = 8
mov ax, [bp+8] ; ax = 6
mov [bp-8], ax ; bp = fff4 - 8 = ffec, [fff0] = 6
当您如下定义符号常量时,不带方括号:
localX equ bp-4
localY equ bp-6
localZ equ bp-8
Fasm 生成此代码来代替标签:
localX = [bp]-04h
localY = [bp]-06h
localZ = [bp]-08h
结果将与第一个示例相同。
当您将符号常量定义为
localX equ [bp-4]
localY equ [bp-6]
localZ equ [bp-8]
Fasm 计算出这意味着什么。
bp = fff4
如果这些地址下的 sub 4
、sub 6
和 sub 8
是 0's
,那么每个标签下的结果都是相同的 [bp] + 00h
localX equ [fff4 - 4 = fff0] ; [fff0] = 0
localY equ [fff4 - 6 = ffee] ; [ffee] = 0
localZ equ [fff4 - 8 = ffec] ; [ffec] = 0