Нужна помощь в печати строк в программе ASM - PullRequest
0 голосов
/ 03 февраля 2011

вот код:

 .model tiny

; assemble me this way
; ml /AT /c /Zm /coff /omf <file name>

; link me this way
; link2 /TINY <obj name>

COMSEG SEGMENT
org 7C00h

.code
start:
    MyStr BYTE "HelloWorld", '$'

    cld     ; Clear Direction Flag
    mov si, offset MyStr
whileloop: 
    lodsb                   ;; While Hello[Si] != '$' 
    cmp al, '$'
    jne doproc
    jmp endwhileloop
    doproc: 
        mov ah, 0ah           ;;     Video operation in Ah to write
                             ;;           character in Al to screen.
        mov bh, 0            ;;     Alpha page 0
        mov cx, 1
        int 10h      
        jmp whileloop
endwhileloop:
    jmp $                   

    db 510-($-start) dup (0)   ;Loads of zeroes
    dw 0AA55h  

end start
COMSEG ENDS

Этот код выводит мусор только на приглашение cmd. MASM, Windows XP, работает под 16-битной виртуальной машиной. Если бы кто-нибудь помог мне правильно распечатать символы на экране, это было бы здорово.

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

Я немного заржавел в этом - но, хотя вы программируете в «крошечной» модели, вы не гарантируете, что DS (регистр сегмента данных) указывает на сегмент памяти, где на самом деле находятся ваши данные.

Если это так, то принудительное выполнение DS = CS перед входом в ваш цикл должно заставить код выше работать - просто выполните:

push CS
pop DS 

перед строкой whileloop:

Я не помню вызова INT 10h, чтобы проверить, в порядке ли они, я предполагаю, что вы установили там правильные параметры).Кроме этого у вас могут быть проблемы с определенным синтаксисом MASM, и я не могу с этим помочь.

0 голосов
/ 03 февраля 2011

Моя сборка немного ржавая, но вы можете использовать системный вызов DOS для печати строки:

mov dx, offset MyStr
mov ah,9
int 21h

Если вы действительно хотите использовать подпрограммы BIOS, я думаю, вам нужно загрузить ah зарегистрироваться с 0eh, а не 0ah.

...