【问题标题】:TASM Print characters of stringTASM 打印字符串的字符
【发布时间】:2016-04-19 23:45:46
【问题描述】:

我正在尝试逐个字符地打印一个字符串,并对其进行迭代。这就是我所拥有的:

.MODEL SMALL
.STACK 64
.DATA
    string DB 'Something',0
    len equ $-string

.CODE

    xor bx, bx    
    mov si, offset string
Char:
    mov al, byte[si + bx]
    inc bx
    cmp bx, len
    je Fin

    mov ah, 2
    mov dl, al
    int 21h

    jmp Char

Fin:
    mov ax, 4c00h
    int 21h
END

我不知道我是否得到了正确的字符串内存引用,因为它只显示了奇怪的符号。我尝试将 30 添加到 dl,认为这是因为 ascii 表示。

如何逐字符打印?

【问题讨论】:

  • 尝试将.DATA 更改为.CODE
  • @RossRidge 尝试过,但仍然输出奇怪的符号
  • 好的,在代码mov ax,@data; mov ds,ax 的开头尝试以下两行。您需要撤消我之前建议的更改。
  • 大声笑谢谢,出于某种奇怪的原因,我在写:mov dx,ax,而不是 ds。谢谢,现在工作:)!! @RossRidge 发布它,我可以将您标记为答案:)
  • 链接时缺少代码入口点(如何编译代码?)。我需要在第一条指令之前添加标签(例如:start: 然后将其添加到 END 指令中:END start 否则 tlink 抱怨 Fatal: No program entry point

标签: windows assembly tasm


【解决方案1】:

这是一个使用 Tasm 的工作示例,它不会破坏字符串的开头。

由于稍后移动增量并将je替换为jnz,因此它少了一次跳转

.MODEL SMALL
.STACK 64
.DATA
    string DB 'Something'
    len equ $-string

.CODE

Entry:
    mov ax, @data   ;make DS point to our DATA segment
    mov ds, ax

    xor bx, bx      ;bx <-- 0
    mov si, offset string ;address of string to print

    mov ah, 2       ;we will use repeatedly service #2 of int 21h

Char:
    mov dl, [si + bx] ;dl is the char to print
    int 21h         ;ask DOS to output a single char

    inc bx          ;point to next char
    cmp bx, len     
    jnz Char        ;loop if string not finished

    mov ax, 4c00h
    int 21h         ;DOS exit program with al = exit code

END Entry

【讨论】:

  • 您可以将mov ah, 2 移到Char: 上方的循环之外,因为int 21h/ah=2 只会破坏AL(打印的最后一个字符在AL i>)。
  • @MichaelPetch:确实。我以这种方式修改了程序,增加了 cmets。
  • 没问题。我之前只是快速扫了一眼。当我今晚再次偶然发现这个 Q 时,我注意到了这一点。 mov al, [si + bx] mov dl, al 可以降为mov dl, [si + bx]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
相关资源
最近更新 更多