Счетчик в сборе - PullRequest
       5

Счетчик в сборе

2 голосов
/ 06 ноября 2011

Для науки, мне нужно три программы, которые насчитывают до 50000 и выводят каждое число, как они делают, мне нужна одна на 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 на ассемблере, и сейчас он насчитывает 50000, ноне выводит каждое число при расчете.

Ответы [ 3 ]

3 голосов
/ 06 ноября 2011

Скопировано из моего комментария:

Если вы пытаетесь создать 16-битный com-файл MS-DOS, вам следует использовать [биты 16].И поскольку @Vlad говорит, что AH = 09h принимает строку в DX, а не число (см., Например, здесь о том, как преобразовать число в строку, также обратите внимание, что вам придется $ -определять строку вместоNUL-прекратить это).

Некоторые другие вещи:

  • mov bx, target перемещает адрес target в 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 голос
/ 06 ноября 2011

Я думаю, что вы не выполняете печать должным образом.

Это здесь говорит о том, что при Int 21 / AH = 09h вы печатаете строку, определенную $, которая ни ваша строкани ваши цифры не кажутся.

Возможно, вам придется кодировать свой собственный номер, печатая, цифра за цифрой, возможно, с Int 21 / AH = 02h .

0 голосов
/ 07 ноября 2011

Подождите, сборка не является синонимом старого пыльного материала, который никто не использует.

Если честно: вам нужно показать некоторые инновации.(16 битная сборка на win7 противоположна этому)

У вас нет никаких требований, кроме как пойти на ярмарку и использовать свой компьютер win7?

  • Если ваша ОС 64-битная

используйте goasm в комплекте с IDE и сообщество огромно.

  • Если вы на 32-битном

перейти с masm32 и winasm .

Я все для использования старой школы сборки, но, пожалуйста, не делайте 16-битные программы на Windows 7 и попробуйте использоватьWindows API вместо прерываний.(сгенерированный код все равно будет около 4 КБ, если это то, что вам нужно показать на выставке)

...