Как напечатать 0,2,4,6, ... на ассемблере? - PullRequest
0 голосов
/ 10 февраля 2009

У меня есть задание из моего комп. система орг. тема и, к сожалению, я немного нов, когда дело доходит до языка ассемблера. Я должен написать программу, которая отображает числа 0,2,4,6,8,10 соответственно. Как бы я пошел по этому поводу?

Может быть, это ответит на мой вопрос: (Реакции, пожалуйста)

.model small
.stack 100H
.data
.code

call proc

mov cx,5

mov dx,0
L1:
mov bx,2
add dx,bx
mov ah,02h
loop L1
int 21
endp

Ответы [ 9 ]

5 голосов
/ 10 февраля 2009

Идите к своему лектору и / или наставнику и попросите совета. Вот для чего они здесь. Вы не дали нам нигде около достаточно информации, чтобы помочь вам.

Вот как я думаю должна выглядеть ваша программа ABCD. Я предлагаю вам использовать его в качестве основы для создания версии 0 2 4 ....

    model  proc
    .stack 100H
    .data
    .call

    main   proc

    mov    cx,10     ; 10 loops only.
    mov    dx,40h    ; start dx at 'A' - 1.
L1:
    inc    dx        ; move to next character.

    mov    ah,02h    ; int 21,02 is print character.
    int    21h

    loop   L1        ; loop until cx is 0

    mov    ax,4c00h  ; int 21,4c is exit with al holding exit code.
    int    21

    endp

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

Если вас чему-то учат, это никогда не длится, но, если вы чему-то учитесь, оно длится вечно (несмотря на алкогольные мозоли: -).

Int 21 - это прерывание DOS, которое позволяет программам на ассемблере использовать различные функции DOS. Концептуально это огромный оператор switch, основанный на регистре AH, поэтому вы увидите такие вещи, как Int 21 Fn 02, что означает выполнение mov ah,2 с последующим int 21.

Int 21 Fn 02 возьмет содержимое DL и выведет его на экран. Итак, последовательность:

mov ah,02h
mov dl,41h
int 21h

выведет символ «A» (0x41).

Аналогично, Int 21 Fn 4c выйдет из текущего запущенного процесса.

4 голосов
/ 10 февраля 2009

Язык ассемблера - это символическое представление числовых машинных кодов и других констант, необходимых для программирования конкретного процессора (или архитектуры). Таким образом, язык ассемблера для Mac (последний раз Intel X86) отличается от языка, используемого на iPhone - ARM.

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

3 голосов
/ 10 февраля 2009

Я уверен, что ваш класс дал вам некоторое образование здесь. Можете ли вы написать достаточно сборки, чтобы напечатать одно или два числа? Можете ли вы написать код, достаточный для вычисления чисел, даже если вы не можете их напечатать?

Отправьте столько кода, и вы можете найти помощь здесь.

В противном случае вы просите других сделать домашнее задание за вас.

3 голосов
/ 10 февраля 2009

Вы знаете, что существует несколько разновидностей "языка ассемблера".

2 голосов
/ 10 февраля 2009

Вы можете сделать это точно так же, как программа, которая печатает A, B, C, D и т. Д .: за исключением того, что вместо того, чтобы начинаться с 'A', начинайте с '0; и вместо увеличения на 1 каждый раз (с «A» до «B»), увеличивайте на 2 (с «0» до «2»).

После печати «0», «2», «4», «6» и «8», следующим числом, которое вы хотите напечатать, будет «10».

Чтобы напечатать «10», вы можете напечатать «1», а затем «0». Или вместо вызова int 21 с ah=2 (который печатает по одному символу за раз), вы можете установить ah=9 для печати строки (установите ds:dx для блока памяти, который содержит "10$") .


Позже вы предложили следующее решение и попросили критиковать:

.model small
.stack 100H
.data
.code

main proc

call defineuser1
call defineuser2
mov cx,5

userdefine1 proc
L1:
mov dx,0
mov bx,2
add dx,bx
mov ah,02h
loop L1
int 21h
endp

userdefine2 proc
mov ah, 4ch
int 21h
userdefine2
endp

Моя критика такова:

  • defineuser1 не существует (думаю, вы имеете в виду userdefine1)

  • установка cx должна быть внутри (не раньше) процедуры

  • вызов int 21 должен быть внутри (а не снаружи) цикла

  • вам нужна специальная обработка для "10", как я упоминал выше

  • Существует разница между '0' (символ / цифра ASCII) и 0 (число) ... вам необходимо напечатать символ / цифру, а не число

  • Вам нужно научиться тестировать свой код (написать его, пройти через него с помощью отладчика и отладить его), желательно перед тем, как отправлять вопросы о нем.

0 голосов
/ 25 января 2019
.model small
.stack 100H
.code
.data
var2 DB "10$"
main proc
    mov cx,4
    mov ax,0
    mov dl,al
    add dl,30h
    mov ah,02h
    int 21h
    mov ax,0
    var1:
   add ax,2
   mov dl,al
   add dl,30h
   mov bx,ax
   mov ah,2h
   int 21h
   mov ax,bx
   loop var1
   mov ax,@data
   mov ds,ax
   mov dx,offset var2
   mov ah,09h
   int  21h
   main endp
end main    

Я новичок в информатике, и когда я увидел этот вопрос, я просто хотел попробовать его. Мне удалось это сделать, и вот код

0 голосов
/ 10 февраля 2009

Счетчик должен начинаться с нуля и многократно увеличивать его на два, печатая результат.

0 голосов
/ 10 февраля 2009
MOV AX, 0
MOV BX, 2

ADDLOOP:
ADD AX, BX
CMP AX, 10
JE DONE
JMP ADDLOOP

DONE:

Ok. Это моя лучшая попытка. Осталось много деталей. Я должен также упомянуть, что я не имею ни малейшего понятия, как печатать символ на экране.

Как и другие, вы не указали, какой язык ассемблера, поэтому я выбрал x86.

Наконец, поговорите со своими инструкторами, они помогут вам гораздо больше, чем мы.

0 голосов
/ 10 февраля 2009

Используете ли вы макрос для вывода?

должно быть что-то вроде ...

 </p>

<pre><code>        mov eax, 0

myloop: cmp eax, 10 JG сделано выходной макрос eax добавить eax, 2 JMP Myloop сделано:

конечно, это для сборки 8086.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...