2016-03-03 5 views
-1

Я сравнивал фиксированную строку и строку ввода. Но трудно понять, что такое регистр входного, al, ah или что-то еще. Я просто новичок, и это болезненный язык для программиста lol jk. пожалуйста, помогите я действительно ценю это спасибо :)Язык ассемблера - что такое регистр ввода строки temp

mov dx, offset temp    ;string input 
mov ah, 0ah 
int 21h  

mov bl, "a"      ;condition 
cmp al, bl 
jne aw 

mov dx, offset msgTrue   ;true 
mov ah, 09 
int 21h 

aw:        ;false 
mov dx, offset msgFalse 
mov ah, 09 
int 21h 


ret 
    msg db 10, 13, "   *   ************************************  *****$" 
    msg1 db 10, 13, "   ***  *   Ticketing System  *  ***$" 
    msg2 db 10, 13, "   *****  ************************************   *$" 
    msg3 db 10, 13, "       ==========================$" 
    msg4 db 10, 13, "       = (a)Land    =$" 
    msg5 db 10, 13, "       = (b)Water    =$" 
    msg6 db 10, 13, "       = (c)Air    =$" 
    msg7 db 10, 13, "       ==========================$" 
    msg8 db 10, 13, "       Choose Travel Type: $" 
    temp db 2, 0, 3 dup("$") 

    msgTrue db 10, 13, "       You selected Land$" 
    msgFalse db 10, 13, "       Invalid Input$" 
+0

Обратите внимание, что вам не нужно указывать 'msg1' /' msg2' и т. Д. Вы можете просто иметь немаркированные строки 'db'. –

ответ

1

Результат в памяти, где вы запросили системный вызов, чтобы поместить его. См. Ответ Ральфа.

Проверьте вход так:

mov dx, offset temp    ; input buffer 
    mov ah, 0ah      ; buffered input syscall 
    int 21h  

    ; select one of two messages to print 
    mov dx, offset msgTrue 
    cmp byte ptr [temp+2], 'a'  ; compare the first byte of user input 
    je .true 
    mov dx, offset msgFalse   ; conditionally skip this instruction 
.true: 

    mov ah, 09      ; print string syscall 
    int 21h 

Обратите внимание, как код mov ah/int 0x21 появляется только один раз, и ветвь пропускает только по одной команде. Вы можете сделать это с cmov на современном процессоре, но cmov досадно не имеет кодировки с непосредственным исходным кодом.

См. Комментарии к ответу Ральфа за критику раздутого кода, который возникает не только при использовании непосредственных операндов с cmp. Вы также привязываете намного меньше регистров при использовании констант времени сборки.


Другой вариант (вместо mov dx, offset msgFalse) будет add dx, offset msgFalse - msgTrue, что делает непосредственный операнд небольшое количество (фитинг в пределах -128 .. 127 диапазона для использования кодировки IMM8). Однако он не сохраняет байты кода в 16-битном коде, потому что mov dx, imm16 имеет 3 байта (выделенный код операции для каждого реестра dest), а add dx, imm8 также имеет три байта (без выделенного кода операции). Это позволит сэкономить байты в 32-битном коде, где адреса 32 бита.

2

используется системным вызов 0AH (буферном входа) http://spike.scu.edu.au/~barry/interrupts.html#ah0a поэтому считываемые данные находятся в температурах (буфер)

0Ah читает п байты из STDIN в буфер

mov bx, OFFSET buffer помещает адрес буфера (здесь TEMP) в Ом, это необходимо для 0AH

Чтобы зафиксировать количество прочитанных байт, которые можно использовать, например, mov byte [bx],15

смотри также этот http://www.fysnet.net/kbbuffio.htm

mov bl, 'a'      ;condition 
cmp al, bl 
jne aw 

сравнивает два 8-битных значений (символов), см это http://x86.renejeschke.de/html/file_module_x86_id_35.html (AL, AH 8 бит, AX 16 бит и EAX составляет 32 бит (Расширенная AX))

Смотрите эту https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture#General-purpose_registers_(16-bit_naming_conventions) для 8-/16-/32-/64-битных соглашения об именах

Это может быть использовано для чтения входного чтения байт из входного буфера температуры и с ompare it:

val DB 'a' 
mov al, val     ;condition 
mov bx, OFFSET temp   ; address of temp in bx: bx is a pointer to first byte in temp now 
;alternatively you can use lea bx, [temp] 
add bx, 2      ; structure of input buffer (here temp) http://spike.scu.edu.au/~barry/interrupts.html#dosbuf 
mov dl, byte [bx]    ; writes the byte [bx] points to in dl - [bx] dereferences bx - the byte command treats bx as a char* - see https://www.cs.uaf.edu/2006/fall/cs301/lecture/10_02_pointer.html 
cmp al, dl 
jne aw 
+0

Почему бы не указать, что 'cmp al, 'a'' будет проще? Не нужно связывать bl, когда немедленно будет работать то же самое. Существует даже специальная кодировка для cmp-instant-with-al, поэтому это всего лишь двухбайтная инструкция, даже с немедленной.Кроме того, как вы думаете, что неправильно с 'mov bl, 'a''? Большинство ассемблеров позволяют использовать символьные константы везде, где может появляться целочисленная константа. Многосимвольные константы производят многобайтовые целые числа. –

+0

ОК, я меняю это ... –

+0

По-прежнему неуклюжий по сравнению с 'cmp byte [temp], 'a'' /' jne'. Также обратите внимание, что 16-разрядные эффективные адреса не могут использовать dx в качестве базы или индекса, только BX/BP + SI/DI. [16 бит не может использовать байты SIB, поэтому им необходимо замять все режимы адресации в байтах mod/rm] (http://stackoverflow.com/a/34058400/224132). Это всего лишь одна из многих причин, из-за которых стоит 16-битный код, и это пустая трата времени на изучение. (Эти ограничения не существуют в других режимах). –

Смежные вопросы