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

时间:2014-05-08 19:10:19

标签: assembly x86

我遇到了一个小型汇编语言程序的问题。

此程序获取输入并将其转换为大写或小写。它正在正确转换,但是正在提供垃圾输出,我不知道为什么。

.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

2 个答案:

答案 0 :(得分:1)

你用DOS终止函数退出这个程序的事实让人难以置信的是事先要初始化CX! 你肯定需要在'lop'循环开始时初始化CX = 15。

如果在输入时按ENTER键,则CX将具有剩余值。好但仍然有缺陷。 如果没有,CX将在你的'con:'计划部分开始时真正灾难性的0。

您的转化基于与ASCII 60h的单一比较。当呈现非字母字符时,这将不可避免地导致垃圾。

第二次写cmp [si],al是多余的 以下jae co仅需ja co 以下三重奏指令从未执行过。

大写部分'co:'肯定永远不会落入下一个错误使用AX而不是AL的程序部分。

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

答案 1 :(得分:0)

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