Правильно ли указан этот код (число плюс число, затем напечатайте результат) - PullRequest
0 голосов
/ 02 апреля 2012

Я хочу сделать что-то простое на языке ассемблера.
сложить два числа и вывести результат на экран.

Я сделал этот код:

.Model SMALL
.Stack 100h

.Code
start:
   MOV ax, 10
   ADD ax, 5
   MOV ah, 02h
   INT 21h 

   MOV ah, 01h
   INT 21h

   MOV ah, 4ch
   INT 21h

end start

После компиляции кода без каких-либо ошибок, говорит мне странный символ.


Изменено:

MOV dl, 10
ADD al,5
MOV dl, al

MOV ah,02h
INT 21h 

но все равно вывести странный символ, я не знаю, чтоможно сделать, чтобы напечатать номер на экране

1 Ответ

2 голосов
/ 02 апреля 2012

Да, вы получите , скорее всего, получите странный символ, потому что int 21 / ah = 02 требует, чтобы символ для печати был в регистре dl, а вы не заполнили dlчто угодно.

Возможно, вы захотите передать значение следующим образом:

mov  ax, 10
add  ax, 5

push ax             ; these are the two new lines.
pop  dx

mov  ah, 02h

Однако имейте в виду, что даже если вы do передаете значение из al до dl, символ номер 15 может быть не тем, что вы ожидаете.15 является одним из управляющих символов ASCII, и я не уверен, что для них будут выводиться прерывания DOS.

Если вы хотите распечатать цифры 15, вам потребуется two звонки, один с dl = 31h и второй с dl = 35h (два кода ASCII для символов 1 и 5).

Если вы хотите узнать, как получить число взарегистрируйте и выведите цифр для этого числа в удобочитаемой форме, в есть мой псевдокод, более ранний ответ .

.-код:

    val = 247

    units = val
    tens = 0
    hundreds = 0
loop1:
    if units < 100 goto loop2
    units = units - 100
    hundreds = hundreds + 1
    goto loop1
loop2:
    if units < 10 goto done
    units = units - 10
    tens = tens + 1
    goto loop2
done:
    if hundreds > 0:                 # Don't print leading zeroes.
        output hundreds
    if hundreds > 0 or tens > 0:
        output tens
    output units
    ;; hundreds = 2, tens = 4, units = 7.

Теперь вам нужно перевести это в сборку x86.Давайте начнем с желаемого значения в ax:

    mov  ax, 247                 ; or whatever (must be < 1000)
    push ax                      ; save it
    push dx                      ; save dx since we use it

    mov  dx, 0                   ; count of hundreds
loop1:
    cmp  ax, 100                 ; loop until no more hundreds
    jl   fin1a
    inc  dx
    sub  ax, 100
    jmp  loop1
fin1a:
    add  dx, 30h                 ; convert to character in dl
    push ax                      ; save
    mov  ah, 2
    int  21h                     ; print character
    pop  ax                      ; restore value

    ; now do tens and units the same way.

    pop dx                       ; restore registers
    pop ax

Теперь этот сегмент кода (несмотря на какие-либо ошибки из-за того, что я давно собирался) должен распечатать цифру сотен и оставить топортолько с цифрами десятков и единиц.

Простое дублирование функциональности должно быть в два раза больше, чтобы получить места в десятках и единицах.

...