繁体   English   中英

x86汇编语言程序的垃圾输出

[英]Garbage output from an x86 assembly language program

小型汇编语言程序出现问题。

该程序获取输入并将其转换为大写或小写。 它可以正确转换,但是会产生垃圾输出,我不知道为什么。

.model small
.stack 64

.data
data1 Db 15 dup(?),'$'
data2 Db 15 dup(?),'$'

.code
start:
    MOV     AX, @data
    MOV     DS, AX
    MOV     SI, OFFSET data1
    MOV     BL, 0Dh
lop:
    MOV     AH, 01h
    INT     21h
    CMP     AL, BL
    JE      con
    MOV     [SI], AL
    INC     SI
    LOOP    lop
con:
    MOV     SI, OFFSET data1
    MOV     DI, OFFSET data2
conv:
    MOV     AL, 60h
    CMP     [SI], AL
    JBE     lo
    CMP     [SI], AL
    JAE     co
    CMP     [SI], BL
    JE      quit
    JMP     quit
co:
    MOV     AL, [SI]
    SUB     AL, 20h
    MOV     [DI], AL
    INC     SI
    INC     DI
    LOOP    conv
lo:
    MOV     AX, [SI]
    ADD     AX, 20h
    MOV     [DI], AX
    INC     SI
    INC     DI
    LOOP    conv

quit:
    MOV     DX, OFFSET data2
    MOV     AH, 09h
    INT     21h
    MOV     AH, 4Ch
    INT     21h

END start

您实际上以某种方式使用DOS Terminate功能退出了该程序,这使得CX事先被初始化是令人难以置信的!
您肯定需要在“循环”循环的开始时初始化CX = 15。

如果在输入时按ENTER,则CX将具有残值。 好,但仍然有问题。 如果不是这样,那么在您的“ con:”程序部分开始时,CX确实是灾难性的0。

您的转换基于与ASCII 60h的单个比较。 当使用非字母字符时,这将不可避免地导致垃圾。

第二次编写cmp [si],al是多余的。
以下jae co只需要ja co
后面的三重指令永远不会执行。

在下一个错误地使用AX而不是AL的程序部分中,大写部分'co:'绝对不应掉线。

您最好用16个$字符初始化缓冲区'data2',因为现在不知道DOS将显示什么!

我还没有坐下来尝试过该程序,但是我发现有时候使用OFFSET时,汇编器会感到困惑,而用LEA替代将神奇地解决这些问题。 如果这不起作用,那么您将遇到一个逻辑错误,我只是没有看到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM