Assembly 将所有小写字母转换为大写字母的汇编程序
我正试图用8086TASM编写一个汇编程序,将所有小写字母转换成大写字母。我是汇编语言编程新手,所以我很想知道我做错了什么。任何帮助都会很好,谢谢。因此,到目前为止,我的代码是:Assembly 将所有小写字母转换为大写字母的汇编程序,assembly,x86-16,Assembly,X86 16,我正试图用8086TASM编写一个汇编程序,将所有小写字母转换成大写字母。我是汇编语言编程新手,所以我很想知道我做错了什么。任何帮助都会很好,谢谢。因此,到目前为止,我的代码是: data segment sir2 dw 10 dup(?),'$' sir1 dw 10,?,11 dup(?) msg1 db 10,13,"introduceti sirul:$" msg2 db 10,13,"sirul convertit este:$" len dw ? data ends assume
data segment
sir2 dw 10 dup(?),'$'
sir1 dw 10,?,11 dup(?)
msg1 db 10,13,"introduceti sirul:$"
msg2 db 10,13,"sirul convertit este:$"
len dw ?
data ends
assume ds:data,cs:code
code segment
start:
mov ax,data
mov ds,ax
xor ax,ax
xor cx,cx
xor dx,dx
xor si,si
mov ah,09h
lea dx,msg1
int 21h
xor dx,dx
mov ah,0Ah
lea dx,sir1
int 21h
mov cx,sir1[1]
mov ch,0
mov len,cx
mov ch,0
mov si,2
dec cx
verify:
cmp sir1[si],97
jg uppercase
inc si
loop verify
uppercase:
cmp cx,0
je endd
sub sir1[si],20h
inc si
dec cx
jmp verify
endd:
xor bx,bx
mov bx,sir1
mov sir2,bx
xor dx,dx
mov ah,09h
lea dx,sir2
int 21h
mov ah,04ch
int 21h
code ends
end start
这不是一个完整的解决方案,因为它看起来好像你想自己完成任务。您需要的伪代码如下所示:
Set the count to 0
For each byte b of input
if b ≥ 'a'
if b ≤ 'z'
Subtract (`a' - 'A`) from b
Increment the count
Set the following byte to the terminator character '$'
顺便说一下:可能是你的教授让你写了一个16位的MS-DOS程序。如果任何一位CS教授正在读这篇文章,我强烈建议教授汇编语言的更好方法是作为一个从HLL中的一个简单测试驱动程序调用的子程序。适用于多种语言和操作系统的现代免费编译器完全能够将用不同语言编写的目标文件链接在一起!此外,这更接近于当今汇编的实际应用:编写底层内核代码,检查编译后的代码以了解实际情况,手动优化对性能至关重要的大型程序部分。可能重复@sivizius:这是一个调试帮助问题,而不是要求完全不同的实现。因此,它是离题的,因为它没有说明实际发生了什么(什么错误,等等),所以它不是一个,和。但这不是骗局。这个问题是一个相当笨拙的实现,尤其是使用数值常量而不是
'a'
或其他什么。具有更清晰的字母字符检测。如果您同时查看大写字母和小写字母的二进制表示,则可以采取更简单的方法。您将看到一个非常有用的模式,它允许您简单地对位掩码进行或转换。如果您希望其他人查看您的代码,则需要添加注释。好的,比如xor si,si不只是说“将si寄存器设置为0”,解释为什么0是一个好的选择。顺便说一句,被迫对代码的功能进行推理是避免bug的一个很好的方法。调试器可帮助您找到其他调试器。此任务已执行多次(请参阅重复项)。为什么我们要帮助调试一些没有注释的、不明显的、并且对于这个任务来说过于复杂的代码?一个简单的cmp-al,'a'
jb-nope
cmp-al,'z'
ja-nope
和al,(0xff-'a'+'a')
nope:
将完成“谁选择让你编写16位MS-DOS程序”的任务。最有可能的答案是:“我们这样做了30年,对我们有好处的,对你也有好处,年轻人,我的孩子!”