我是汇编语言的新手,我在DOSBOXx86-16中使用TASM编程
我在互联网上到处寻找一种初始化局部变量的TASM方法,却没有发现。
实际上,我之前的第一个问题是如何在TASM中创建一个局部变量。
在没有为TASM找到一个特别的,我尝试了一个为MASM和刚刚尝试它在TASM和令人惊讶的是它的工作!
现在唯一的问题是我找不到初始化局部变量的方法。我想出了一个天真的解决方案,下面是我的代码:
.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问题
.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的第二个注释中所看到的那样,由于某种原因,
a局部变量的开头。我把它改成了LEA DX, [a],然后它突然起作用了。以下是这两种代码的输出:LEA DX, [a]

MOV DX, OFFSET a

你觉得这到底是怎么回事?
,
除了我使用本地指令外,一切都很好。以下是错误:

在EMU8086中声明和初始化局部变量的正确语法是什么?
最后,如果你们知道一个非常好的x86-16 TASM DOSBOX汇编教程,请分享,一些能解释这个和那个寄存器到底做什么的东西(一些完美地解释了基本原理的东西)
发布于 2020-12-06 09:16:34
TASM chess3.asm, chess3.obj, chess3.lst给出清单文件chess33.lst
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中,但在非小型内存模型中并不总是如此。
https://stackoverflow.com/questions/65160405
复制相似问题