【问题标题】:Insert a new line assembly 8086插入新行组件 8086
【发布时间】:2016-12-11 21:33:17
【问题描述】:

我正在学习汇编语言,但我有疑问。我正在用这段代码编写一个简单的“hello world”:

.model small
.stack
.data
    message db 'Hello world! $'
.code
start:
    mov dx,@data
    mov ds.dx

    lea dx,message
    move ah,09h
    int 21h

mov ax,4c00h
int 21h
end start

我假设 message db 'Hello world! $' 像字符串一样工作,现在我想知道是否可以添加类似 \n 的内容以将输出分成两行,例如 message db 'Hello\nworld! $'。这可能吗?

【问题讨论】:

  • 取决于您未指定的汇编程序。如果您的汇编程序不支持 \n 样式转义,您可能必须手动插入 ascii 代码。
  • 组装8086
  • db 'Hello' 是“方便”轻松定义字节,当它们的值很容易在 ASCII 编码中定义时......主要像字符串......但它与写 db 72, 101, 108, 108, 111 = > 定义五个字节值(当被视为 ASCII 字符串时,等于“Hello”)。虽然您很少想要通过 ASCII 编码定义非字符串数据,但您可以

标签: assembly x86-16


【解决方案1】:
message db 'Hello world! $'

许多汇编程序不会解释嵌入在字符串中的 \n。
大多数汇编程序将接受以下插入换行符:

message db 'Hello',13,10,'world!',13,10,'$'

13为回车,10为换行。

【讨论】:

  • 如果我想将 13, 10 存储在某种变量中,那么我可以调用一个执行相同操作的变量而不是调用 13, 10 怎么办?例如:message db 'Hello',13,10,'world!', newLineVar'$'
  • @Triangle4 预处理器指令可以解决问题。在 FASM 中,您将写为 newLineVar equ 13,10。然后预处理器将所有出现的符号常量 newLineVar 替换为其值 13,10。其他汇编器也有类似的概念(%define, ...)。
  • Masm 中的预处理器怎么样?而且您似乎对汇编很了解,有没有我可以用来学习语言的好资源?我发现它与 c 和 c++ 有很多相似之处,并且不禁认为更好地理解它是非常宝贵的。
【解决方案2】:

为我工作(8086 组装):

.MODEL SMALL
.STACK 100H 
.DATA
LOADING DB 'Starting LunaOS...','$'
DONELOADING DB 'Starting LunaOS... done.','$'
.CODE

MOV AX,@DATA
MOV DS,AX

LEA DX,LOADING
MOV AH,9
INT 21H    

LEA DX,DONELOADING
MOV AH,9
INT 21H    

;LEA DX,STRING2
;MOV AH,9
;INT 21H  

;LEA DX,STRING3
;MOV AH,9
;INT 21H 

;LEA DX,STRING4
;MOV AH,9
;INT 21H 

MOV AH,4CH
INT 21H   


END

要添加新行,复制 LEA DX,(STRING NAME) 并复制 MOV AH, 9。然后复制 INT 21h,将其粘贴到新行,将字符串添加到“.DATA”,更改 LEA ,DX(STRING NAME) to LEA,DX(NEW STRING NAME)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2018-12-09
    • 2020-07-26
    相关资源
    最近更新 更多