为什么我无法在 ASM 中正确设置局部变量? (使用emu8086)

问题描述 投票:0回答:1

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

谢谢:)

assembly tasm emu8086
1个回答
0
投票

如果您使用正常编码而不是

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
© www.soinside.com 2019 - 2024. All rights reserved.