【问题标题】:asm program does not work (nasm)asm 程序不工作 (nasm)
【发布时间】:2010-05-08 16:41:41
【问题描述】:
org 0x100
SEGMENT .CODE
    mov ah,0x9
    mov dx, Msg1
    int 0x21

    ;string input
    mov ah,0xA
    mov dx,buff
    int 0x21
    mov ax,0
    mov al,[buff+1]; length

    ;string UPPERCASE    
    mov cl, al  
    mov si, buff
    cld
loop1:
    lodsb;
    cmp al, 'a' 
    jnb upper
loop loop1
;output
mov ah,0x9
mov dx, buff
int 0x21

exit:
    mov ah, 0x8
    int 0x21
    int 0x20
upper:
    sub al,32 
    jmp loop1
SEGMENT .DATA
Msg1 db 'Press string: $'
buff db 254,0

此代码不起作用。 我认为问题出在jnb upper。 这个程序应该把小写字母变成大写字母。

【问题讨论】:

  • 您的问题是什么?您只是在描述一些代码并假设性能不佳。
  • 我不知道为什么我的程序不起作用。
  • 我认为他想将小写转换为大写。
  • 您至少需要说明程序应该做什么,以及您看到的问题是什么。如果这是家庭作业,您可能还应该添加 homework 标签。
  • 当我运行这段代码时,我得到:s48.radikal.ru/i119/1005/5b/5f463e2f9e91.jpg

标签: assembly x86 nasm


【解决方案1】:

您似乎正在尝试将字符串从小写转换为大写?问题是您只是将输入与字母“a”进行比较:

cmp al, 'a' 
jnb upper

如果要从小写转换为大写,则需要检查 'a' 到 'z' 范围内的字符,如果有一次在该范围内,则减去 32。

另外,我认为您想将大写字符写回内存upper。您所做的只是更新寄存器,然后在 loop1 的下一次迭代中被覆盖。

这有帮助吗?

【讨论】:

  • jnb upper:只有大于或等于 a 时才会跳转。我认为他不需要进行任何其他比较。他没有将值写回缓冲区这一事实是真正的问题。
  • 我必须做什么? (我是不久前开始学习汇编的)
  • @nc3b - 很好,但他仍然需要确保它不大于'z'
  • @GLeBaTi - 我已经很久没有编写任何程序集了。如果您有任何问题,请尝试自己编写并回帖给 SO...
【解决方案2】:

我发现了我的问题: 当我输入文本时,'$' - 没有添加。

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2017-12-12
    • 2015-09-22
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多