大会中的反击

时间:2011-11-06 15:05:01

标签: assembly nasm

对于科学展览会,我需要三个程序,数量达到50,000,并按原样输出每个数字,我需要一个用c ++,一个用java,一个用汇编。我有c ++和java程序,但是我没有看到我的汇编代码出错:

    [org 0x100]
    [bits 32]

    mov ax, 0
    mov bx, target
    jmp start

    start:
    mov cx, 0x01
    add ax, cx
    mov dx, ax
    mov ah, 09
    int 0x21
    mov ax, dx
    cmp ax, bx
    jg term
    jmp start

    term:
    mov dx, msgT
    mov ah, 09
    int 0x21
    mov ah, 00
    int 0x21

    msgT db 'Terminating'
    target dw 50000

我正在使用汇编程序NASM,现在,它计为50,000,但在计算它们时不会输出每个数字。

3 个答案:

答案 0 :(得分:3)

从我的评论中复制:

如果您正在尝试制作16位MS-DOS com文件,则应该使用[位16]。正如@Vlad所说AH = 09h在DX中取一个字符串而不是一个数字(参见例如here关于如何将数字转换为字符串,同时请注意,你必须$ -terminate字符串而不是NUL-终止它)。

其他一些事情:

  • mov bx, targettarget的地址移至bx。你想:mov bx, [target]
  • jg term基于签名比较分支(您有效地将ax-15536进行比较)。你想要ja term
  • 您需要确保保留该号码,将其保存在寄存器中需要特别小心。将它保存在堆栈中更容易。

程序的基本结构应该是这样的:

    [org 0x100] ; DOS .COM files are loaded at CS:0100h
    [bits 16]   ; And are 16-bits

start:
    mov ax, 0          ; The current count
printloop:
    push ax            ; Save current number 

    call myconvertfunc ; Some function to convert a number in ax and return a '$'-terminated string in dx
    mov ah, 0x09
    int 0x21

    mov dx, newline    ; Point dx to newline string
    mov ah, 0x09       ; Print $-terminated string in dx
    int 0x21

    pop ax             ; Restore current number

    inc ax             ; Next number 
    cmp ax, 50000      ; Compare number to the maximum number 
    jbe printloop      ; Notice branching based on unsigned comparison is needed

    mov ax, 0x4c00     ; Return 0. AH=4Ch AL=Return value
    int 0x21

newline: db 13, 10, '$' ; String containing "\r\n$"

答案 1 :(得分:1)

我认为你没有正确地进行打印。

这个here表示使用Int 21 / AH = 09h你打印一个$ - 终止的字符串,你的字符串和你的数字都不是。

可能需要使用Int 21/AH=02h来逐位编码您自己的号码打印。

答案 2 :(得分:0)

等等,装配不是没有人使用的旧尘埃的东西的同义词。

如果是公平的话:你需要展示一些创新。 (win7上的16位dos汇编与此相反)

除了参加交易会并使用你的win7电脑之外你没有其他要求吗?

  • 如果您的操作系统是64位

使用goasm完成了IDE,社区非常庞大。

  • 如果您使用的是32位

选择masm32winasm

我全都使用旧学校集会,但请不要在Windows 7上制作16位程序并尝试使用windows api而不是中断。 (如果你需要在展会上展示的话,生成的代码仍然是4kb左右)