as8088中的变量初始化

时间:2015-12-06 09:14:26

标签: function assembly x86 as88 x86-16

我目前正在编写一个基本上只是将字符串中的字符写入变量的函数。

执行测试打印时,我的变量似乎很好。但是当我尝试在函数外部打印分配的第一个变量(inchar)时,它返回一个空字符串,但第二个变量(outchar)似乎返回正常。我是否以某种方式覆盖了第一个变量?

这是我的代码:

_EXIT   = 1
_READ   = 3
_WRITE  = 4
_STDOUT = 1
_STDIN = 1
_GETCHAR = 117
MAXBUFF = 100

.SECT .TEXT
start:
0:  PUSH    endpro2-prompt2
    PUSH    prompt2
    PUSH    _STDOUT
    PUSH    _WRITE
    SYS
    ADD SP,8
    PUSH    4
    PUSH    buff
    CALL    getline
    ADD SP,4
    !!!!!!!!!
    PUSH    buff
    CALL    gettrans
    ADD SP,4
    ADD AX,1 !gives AX an intial value to start loop
1:  CMP AX,0
    JE  2f
    PUSH    endpro-prompt1
    PUSH    prompt1
    PUSH    _STDOUT
    PUSH    _WRITE
    SYS
    ADD SP,8
    PUSH    MAXBUFF
    PUSH    buff
    CALL    getline
    ADD SP,2
    !PUSH   buff
    !CALL   translate
    !ADD    SP,4
    JMP 1b
2:  PUSH    0               ! exit with normal exit status
    PUSH    _EXIT           
    SYS

getline:
    PUSH    BX
    PUSH    CX
    PUSH    BP
    MOV BP,SP
    MOV BX,8(BP)
    MOV CX,8(BP)
    ADD CX,10(BP)
    SUB CX,1

1:  CMP CX,BX
    JE  2f
    PUSH    _GETCHAR
    SYS

    ADD SP,2
    CMPB    AL,-1
    JE  2f
    MOVB    (BX),AL
    INC BX
    CMPB    AL,'\n'
    JNE 1b

2:  MOVB    (BX),0
    MOV AX, BX
    SUB AX,8(BP)
    POP BP
    POP CX
    POP BX
    RET
gettrans:
    PUSH    BX
    PUSH    BP
    MOV BP,SP
    MOV BX,6(BP) !Store argument in BX
    MOVB    (inchar),BL ! move first char to inchar


1:  INC BX
    CMPB    (BX),' '
    JE  1b
    MOVB    (outchar),BL !Move char seperated by Space to outchar

    MOV AX,1    !On success
    POP BP
    POP BX
    RET

.SECT .BSS
buff:
    .SPACE  MAXBUFF

.SECT .DATA
prompt1:
    .ASCII  "Enter a line of text: "
endpro:

prompt2:
    .ASCII  "Enter 2 characters for translation: "
endpro2:    

outchar:
    .BYTE   0
inchar:
.BYTE   0
charct:
    .BYTE   0
wordct:
    .BYTE   0
linect:
    .BYTE   0
inword:
    .BYTE   0

这是用于测试打印的代码

PUSH    1       ! print that byte
PUSH    inchar
PUSH    _STDOUT
PUSH    _WRITE
SYS
ADD SP,8
CALL    printnl !function that prints new line

PUSH    1       ! print that byte
PUSH    outchar
PUSH    _STDOUT
PUSH    _WRITE
SYS
CALL printnl
ADD SP,8

2 个答案:

答案 0 :(得分:2)

指令MOV (inchar),BX将注册BX存储到标记为inchar的内存位置。

但是,inchar已定义为.BYTE,但BX是16位寄存器(2个字节),因此您不仅要编写inchar还有outchar

它开始工作的唯一原因是因为8088是低端架构,所以BX的低位字节首先被存储,而高位字节跟随。

所以,试试MOV (inchar),BL

答案 1 :(得分:2)

似乎有许多as88 8088模拟器环境。但我注意到bug提到的许多代码存储库:

1. The assembler requires sections to be defined in the following order: 
       TEXT
       DATA
       BSS

After the first occurrences, remaining section directives may appear in any order. 

如果您的as88环境遇到类似问题,我建议您在代码中移动 DATA 之后的 BSS 部分。

在您的原始代码中,您有这样的行:

MOV (outchar),BX
[snip]
MOV (inchar),BX

您将 outchar inchar 定义为字节。上面的2行将 BX 寄存器中的2个字节(16位)移动到两个字节变量。这将导致CPU将额外字节写入内存中的下一个变量。您需要显式移动单个字节。这样的事情可能更合适:

MOVB (outchar),BL
[snip]
MOVB (inchar),BL

正如您将看到此代码仍然存在错误,我将在本回答中稍后提及。为了澄清 - MOVB 指令将从 BL 移动一个字节并将其放入变量中。

当您执行 SYS 调用Write时,您需要传递缓冲区的地址以进行打印,而不是缓冲区中的数据。你有两条这样的线:

PUSH    (inchar)
[snip]
PUSH    (outchar)

括号表示取值变量并将它们推入堆栈。 SYS WRITE 需要显示字符的地址。推送其地址的代码应如下所示:

PUSH    inchar
[snip]
PUSH    outchar

gettrans函数在处理从一个缓冲区到另一个缓冲区的字节副本时存在严重缺陷。你有代码执行此操作:

    MOV BX,6(BP) !Store argument in BX
    MOVB    (inchar),BL ! move first char to inchar

1:  INC BX
    CMPB    (BX),' '
    JE  1b
    MOVB    (outchar),BL !Move char seperated by Space to outchar

MOV BX,6(BP)正确放置缓冲区地址作为参数传递并将其放入 BX 。线条看起来像是一个问题:

    MOVB   (inchar),BL ! move first char to inchar

这不是评论所表明的应该做的事情。上面的行将 BX 中缓冲区地址的低字节( BL )移动到变量 inchar 。您希望将字节移动到 BX 指向的内存位置,并将其放入 inchar 。不幸的是,在x86上,您无法直接将数据从一个内存操作数移动到另一个内存操作数。要解决此问题,您必须将数据从 BX 指向的缓冲区移动到临时寄存器(我将选择 CL ),然后将其移动到变量。代码可能如下所示:

MOVB    CL, (BX)
MOVB    (inchar),CL ! move first char to inchar

然后你必须为 outchar 做同样的事情,所以两个地方的修复看起来都类似于:

    MOV BX,8(BP) !Store argument in BX
    MOVB    CL, (BX)
    MOVB    (inchar),CL ! move first char to inchar

1:  INC BX
    CMPB    (BX),' '
    JE  1b

    MOVB    CL, (BX)
    MOVB    (outchar),CL ! move second char to outchar
相关问题