Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 将所有小写字母转换为大写字母的汇编程序_Assembly_X86 16 - Fatal编程技术网

Assembly 将所有小写字母转换为大写字母的汇编程序

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

我正试图用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 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年,对我们有好处的,对你也有好处,年轻人,我的孩子!”