【问题标题】:What is wrong with this assembly code intended to emulate a loop?这个旨在模拟循环的汇编代码有什么问题?
【发布时间】:2012-10-18 15:05:21
【问题描述】:

这段代码应该说 Hello World 五次!

org 100h

string db 'Hello World',0Dh,0Ah,'$'
mov dx,string
mov bl,0

check:
cmp bl,5
jb print
ja term

print:
mov ah,9
int 21h
mov ah,04Ch
int 21h
inc bl
jmp check

term:
ret

我只得到一个 Hello World 作为输出! 我错过了什么吗?

【问题讨论】:

    标签: assembly x86 dos nasm


    【解决方案1】:

    在打印一次字符串后,您将明确退出程序(通过 INT 21h,AH=4Ch)!

    看起来您正在尝试执行“Hello World”字符串,就好像它是代码一样(因为您将它放在操作系统将开始执行程序的地址 100h)。为什么在打印之前不会让您的程序崩溃 anything 一定是纯粹的运气。

    【讨论】:

    • 哇!老实说,我是一个试图从头开始学习 ALP 的菜鸟!非常感谢提供信息的人!是的,确实程序一直在崩溃,并且一个对话框会出现一些 16 位错误!在我把定义字节指令放在最后之后,只有这样输出才会作为一个单一的 Hello World!
    • 太棒了!有效!谢啦! :) 顺便说一句,您能否解释一下代码开头的 origin 指令的目的是什么?以及何时使用 Ah 寄存器中的 4Ch 值?
    • org 100h 是 DOS 时代遗留下来的,当时 .com 文件被限制为 64K 字节。 “操作系统”使用代码段的前 256 个来传递例如命令行参数;从 .com 文件中加载接下来的 65280 字节并跳转到代码段 CS 中的地址 0x100。 org 在汇编程序中设置然后每条指令的“原点”相对于假定的加载地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2019-05-31
    相关资源
    最近更新 更多