gpt4 book ai didi

assembly - 为什么我的代码在添加 .386 时不起作用?

转载 作者:行者123 更新时间:2023-12-03 21:12:48 24 4
gpt4 key购买 nike

正如标题中所解释的,我需要让这段代码能够做与仅使用 16 位相同的事情,但将 .386 添加到代码中,以便我可以使用 32 位寄存器。但是当我现在添加 .386 时,我的代码没有打印任何内容,不知道如何解决这个问题。我的 mov 有问题吗,@data 还是我需要添加其他东西?我正在使用 TASM

TITLE Programa de prueba(prueba.asm)
.386
.model small
.stack

.data

escoga db 10,13,7, 'Escoga la operacion: 1. x and y, 2. x or y, 3. not x, 4. x xor y, 5. terminar:
', '$'

digite1 db 10,13,7, 'Digite el primer numero hexadecimal: ', '$'
digite2 db 10,13,7, 'Digite el segundo numero hexadecimal: ', '$'
Yval db "Enter Y hexadecimal value: ",0
resultStr db "The result is: ",0
result db ?
x db 8 DUP(' '),'$'
y db 8 DUP(' '),'$'
num db 1 DUP(0),'$'

.code
main proc
mov ax, @data
mov ds, ax

.loop1:
cmp si, 82
je .done1
mov ah, 0Eh
mov al, escoga[SI]
mov bh, 00h
int 10h
inc si
jmp .loop1

.done1:
mov si, 0
mov di, 0
.inp1:
cmp si, 1
je .ext1
mov ah, 00h
int 16h
inc si
inc di
jmp .modi1

.modi1:
mov num[di], al
mov ah, 0Eh
mov al, num[di]
mov bh, 00h
int 10h
jmp .inp1

.ext1:
mov si, 0
.ext2:
cmp si, 2
je .salir
mov ah, 0Eh
mov al, num[SI]
inc si
jmp .ext2

.salir:
cmp num[SI-1], '5'
jge .term
jmp .term2

.term2:
mov si, 0

.loop2:
cmp si, 40
je .done2
mov ah, 0Eh
mov al, digite1[SI]
mov bh, 00h
int 10h
inc si
jmp .loop2

.done2:
mov si, 0
mov di, 0

.inp2:
cmp si, 8
je .ext3
mov ah, 00h
int 16h
inc si
inc di
jmp .modi2

.modi2:
mov x[di], al
mov ah, 0Eh
mov al, x[di]
mov bh, 00h
int 10h
jmp .inp2

.ext3:
mov si, 0
mov di, 0

.loop3:
cmp si, 41
je .done3
mov ah, 0Eh
mov al, digite2[SI]
mov bh, 00h
int 10h
inc si
jmp .loop3

.done3:
mov si, 0
mov di, 0

.inp3:
cmp si, 8
je .ext4
mov ah, 00h
int 16h
inc si
inc di
jmp .modi3

.modi3:
mov y[di], al
mov ah, 0Eh
mov al, y[di]
mov bh, 00h
int 10h
jmp .inp3

.ext4:
mov si, 0
mov di, 0

.term:
.exit

main endp

end main

最佳答案

MASM 6.1 documentation是编写实模式分段代码(非 FLAT 模型)的好资源。即使您使用的是 TASM,MASM 文档仍然是一个很好的引用。您遇到的是一种相当微妙的方式的副作用,该方式根据您放置 .386 的位置生成代码。相对于 .MODEL 的指令指示。这种微妙的行为记录在设置段字大小(仅限 80386/486)部分中:

Setting Segment Word Sizes (80386/486 Only)

The use type in the SEGMENT directive specifies the segment word sizeon the 80386/486 processors. Segment word size determines the defaultoperand and address size of all items in a segment. The size attributecan be USE16, USE32, or FLAT. If you specify the .386 or .486directive before the .MODEL directive, USE32 is the default. Thisattribute specifies that items in the segment are addressed with a32-bit offset rather than a 16-bit offset. If .MODEL precedes the .386or .486 directive, USE16 is the default. To make USE32 the default,put .386 or .486 before .MODEL. You can override the USE32 defaultwith the USE16 attribute, or vice versa.


需要注意的是放置的位置 .386 .您已经把它放在 .model 之前因此,汇编程序假设所有部分都是 USE32默认情况下。这意味着正在生成的所有指令都是在假设处理器以 32 位模式运行的情况下进行编码的。 32 位编码指令无法在 16 位代码中正常运行,并且是导致程序失败的原因。
您正在编写将在 16 位实模式下运行的代码(可能使用 386 条指令和寄存器),所以我相信您会希望确保 USE16是使用 .code 时的默认值和 .data指令。要获得您想要的行为,您必须进行以下更改:
.386
.model small
到:
.model small
.386

关于assembly - 为什么我的代码在添加 .386 时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62602889/

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