[英]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.