我遇到了一个小型汇编语言程序的问题。
此程序获取输入并将其转换为大写或小写。它正在正确转换,但是正在提供垃圾输出,我不知道为什么。
.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
答案 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代替会神奇地解决这些问题。如果这不起作用,那么你就会遇到一个我没有看到的逻辑错误。