首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化局部变量

初始化局部变量
EN

Stack Overflow用户
提问于 2020-12-05 18:16:35
回答 1查看 676关注 0票数 1

我是汇编语言的新手,我在DOSBOXx86-16中使用TASM编程

我在互联网上到处寻找一种初始化局部变量的TASM方法,却没有发现。

实际上,我之前的第一个问题是如何在TASM中创建一个局部变量。

在没有为TASM找到一个特别的,我尝试了一个为MASM和刚刚尝试它在TASM和令人惊讶的是它的工作!

现在唯一的问题是我找不到初始化局部变量的方法。我想出了一个天真的解决方案,下面是我的代码:

代码语言:javascript
复制
.model small
.stack 0100h
.data

.code
_MAIN PROC
    MOV AX, @DATA
    MOV DS, AX
        
    LOCAL a[12]: BYTE
    ; my solution to initializing the a[12] local variable
    MOV a[0], 'h'
    MOV a[1], 'a'
    MOV a[2], 'n'
    MOV a[3], 'l'
    MOV a[4], 'o'
    MOV a[5], '$'

    LEA DX, [a]  ; for some reason "MOV DX, OFFSET a" doesn't output "hanlo" in dosbox (i guess it points to a different address? I'm not sure how tho)
    MOV AH, 09h
    INT 21h
        
    ; EXIT
    MOV AH, 4Ch
    INT 21h
_MAIN ENDP
    
END _MAIN

问题

  1. 如何初始化这个局部变量?是否有一种类似于在.data段中初始化变量的方法?像这样:

代码语言:javascript
复制
.model small
.stack 0100h
.data
    inputPrompt db "Enter your name: $" ; can i do something like this, but inside the .code segment?
.code
...

正如您在我的代码MOV DX, OFFSET a的第二个注释中所看到的那样,由于某种原因,

  1. 没有指向a局部变量的开头。我把它改成了LEA DX, [a],然后它突然起作用了。以下是这两种代码的输出:

LEA DX, [a]

MOV DX, OFFSET a

你觉得这到底是怎么回事?

  1. ,我也尝试了EMU8086中的TASM代码,因为我可以清楚地看到寄存器正在被设置,这只是一个非常好的程序来学习组装。但是由于某些原因,当我尝试使用这个精确的代码时,它在执行EMU8086时会出现一个错误,特别是在使用本地指令时(很可能是因为EMU8086使用了不同的语法)。

除了我使用本地指令外,一切都很好。以下是错误:

在EMU8086中声明和初始化局部变量的正确语法是什么?

最后,如果你们知道一个非常好的x86-16 TASM DOSBOX汇编教程,请分享,一些能解释这个和那个寄存器到底做什么的东西(一些完美地解释了基本原理的东西)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-06 09:16:34

TASM chess3.asm, chess3.obj, chess3.lst给出清单文件chess33.lst

代码语言:javascript
复制
  1 0000                         .model small
  2 0000                         .stack 0100h
  3 0000                         .data
  4
  5 0000                         .code
  6 0000                         _MAIN PROC
  7 0000  B8 0000s                   MOV AX, @DATA
  8 0003  8E D8                      MOV DS, AX
  9
 10                                  LOCAL a[12]: BYTE
 11                                  ; my solution to initializing the a[12] local variable
 12 0005  C6 46 F4 68                MOV a[0], 'h'
 13 0009  C6 46 F5 61                MOV a[1], 'a'
 14 000D  C6 46 F6 6E                MOV a[2], 'n'
 15 0011  C6 46 F7 6C                MOV a[3], 'l'
 16 0015  C6 46 F8 6F                MOV a[4], 'o'
 17 0019  C6 46 F9 24                MOV a[5], '$'
 18
 19 001D  8D 56 F4                   LEA DX, [a]  ; for some reason "MOV DX, OFFSET a" doesn't output "hanlo" in dosbox (i guess+
 20                              it points to a different address? I'm not sure how tho)
 21 0020  B4 09                      MOV AH, 09h
 22 0022  CD 21                      INT 21h
 23
 24                                  ; EXIT
 25 0024  B4 4C                      MOV AH, 4Ch
 26 0026  CD 21                      INT 21h
 27 0028                         _MAIN ENDP
 28
 29                              END _MAIN

组装到C6 46 F4 68的指令MOV BYTE [BP-12+0],'h'实际上是伪装的MOV BYTE [BP-12+0],'h',因为LOCAL a[12]: BYTE是在asm时将a定义为BP-12的TASM方法。

LEA DX,[a]被组装成LEA DX,[BP-12]。这就是为什么MOV DX,OFFSET a不组装的原因:MOV DX,OFFSET BP-12是无效指令。

还要注意DOS函数http://www.ctyme.com/intr/rb-2562.htm:它期望DS:DX中的字符串地址,但是使用BP寻址的本地堆栈变量的默认段寄存器是SS (而不是DS)。幸运的是,在您的程序DS=SS中,但在非小型内存模型中并不总是如此。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65160405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档