gpt4 book ai didi

assembly - 在 TASM 理想模式下设置数据段的对齐方式

转载 作者:行者123 更新时间:2023-12-04 02:32:39 27 4
gpt4 key购买 nike

我的汇编源代码:

ideal 
model tiny
segment _data byte ; TASM doesn't accept it.
ends _data

dataseg
align 1 ; Doesn't decrease the segment alignment.
lpText db "Hello, world!$"

codeseg
startupcode
lea dx,[lpText]
mov ah,9
int 21h
exitcode
end

TASM 5.0 为其中包含 byte 的行提供错误 Segment attributes illegally redefined

如何在理想模式下将数据段改为字节对齐?

我需要它,因为我不想在生成的 .com 文件中的 lpText 前面有一个额外的 0 字节。我希望 .com 文件尽可能小。

最佳答案

如果您打算重新打开像 _DATA 这样的段,那么该段必须与先前声明的段属性相匹配。当您使用简化的 DOS 段和 model 指令时,默认为 _TEXT_DATA 段的 WORD 对齐。您已将对齐方式从默认的 WORD 更改为 BYTE,因此出现了您看到的错误。 TASM 5 manual状态:

Segment attributes illegally redefined

A SEGMENT directive reopen a segment that has been previously defined,and tries to give it different attributes. For example:

DATA SEGMENT BYTE PUBLIC
DATA ENDS
DATA SEGMENT PARA ; error, previously had byte alignment
DATA ENDS

If you reopen a segment, the attributes you supply must either matchexactly or be omitted entirely. If you don't supply any attributeswhen reopening a segment, the old attributes will be used.


您有几个选择。一种是比较简单的,就是将代码段中的代码和数据结合起来:

ideal
model tiny

codeseg
startupcode
lea dx,[lpText]
mov ah,9
int 21h
exitcode
lpText: db "Hello, world!$"

end

如果你要组装它,它应该生成一个大小为 25 字节的程序:

00000100  BA0B01            mov dx,0x10b
00000103 B409 mov ah,0x9
00000105 CD21 int 0x21
00000107 B44C mov ah,0x4c
00000109 CD21 int 0x21
0000010B 48 dec ax
0000010C 656C gs insb
0000010E 6C insb
0000010F 6F outsw
00000110 2C20 sub al,0x20
00000112 776F ja 0x183
00000114 726C jc 0x182
00000116 642124 and [fs:si],sp

另一种方法是不使用 model 指令并从头开始声明您自己的段:

ideal
group DGROUP _DATA, _TEXT

segment _TEXT byte 'CODE'
org 100h
ends
segment _DATA byte 'DATA'
ends

segment _DATA
lpText db "Hello, world!$"
ends

segment _TEXT
_start:
lea dx,[lpText] ; or mov dx, offset lptext
mov ah,9
int 21h
ret ; COM programs that use TINY model
; can exit with a RET. DOS places 0000h
; on the stack when program starts. Returning
; to 0000h executes an INT 20h instruction at
; offset 0000h in the PSP
ends

end _start

startupcodeexitcode 指令在简化的段模型之外不起作用,因此您需要自己生成代码。因为我假设您正在使用 tiny 模型来生成 DOS COM 程序,所以您可以使用 ret 从 DOS 返回,假设您不需要返回错误级别。这减少了程序的大小。无需设置段寄存器,因为 CS=DS=ES=SS 都指向 Program Segment Prefix (PSP)当 DOS 开始运行 COM 程序时。生成的程序如下所示:

00000100  BA0801            mov dx,0x108
00000103 B409 mov ah,0x9
00000105 CD21 int 0x21
00000107 C3 ret
00000108 48 dec ax
00000109 656C gs insb
0000010B 6C insb
0000010C 6F outsw
0000010D 2C20 sub al,0x20
0000010F 776F ja 0x180
00000111 726C jc 0x17f
00000113 642124 and [fs:si],sp

生成的 COM 程序应该是22 字节的大小


如果您将之前代码中的 ret 替换为:

mov ah,4ch
int 21h

生成的文件将大小为 25 字节,更重要的是,_DATA 段未在 WORD 边界上对齐:

00000100  BA0B01            mov dx,0x10b
00000103 B409 mov ah,0x9
00000105 CD21 int 0x21
00000107 B44C mov ah,0x4c
00000109 CD21 int 0x21
0000010B 48 dec ax
0000010C 656C gs insb
0000010E 6C insb
0000010F 6F outsw
00000110 2C20 sub al,0x20
00000112 776F ja 0x183
00000114 726C jc 0x182
00000116 642124 and [fs:si],sp

关于assembly - 在 TASM 理想模式下设置数据段的对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63274094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com