В одной из первых своих программ наткнулся на проблему: из стека в регистр достается не то значение, которое я в него записывал. Разъясните ситуацию. Вот код: Код (Text): 13D9:0100 30C0 XOR AL,AL 13D9:0102 B406 MOV AH,06 13D9:0104 B710 MOV BH,10 13D9:0106 B505 MOV CH,05 13D9:0108 B110 MOV CL,10 13D9:010A B610 MOV DH,10 13D9:010C B23E MOV DL,3E 13D9:010E CD10 INT 10 13D9:0110 51 PUSH CX //вроде как тут в стек записал 0510 13D9:0111 B90400 MOV CX,0004 13D9:0114 E80400 CALL 011B 13D9:0117 E2FB LOOP 0114 13D9:0119 CD20 INT 20 13D9:011B 88CB MOV BL,CL 13D9:011D 59 POP CX //а тут из него вылезает 0117 13D9:011E 80C710 ADD BH,10 13D9:0121 80C501 ADD CH,01 13D9:0124 80C101 ADD CL,01 13D9:0127 80EE01 SUB DH,01 13D9:012A 80EA01 SUB DL,01 13D9:012D CD10 INT 10 13D9:012F 51 PUSH CX 13D9:0130 31C9 XOR CX,CX 13D9:0132 88D9 MOV CL,BL 13D9:0134 EBE1 JMP 0117 С моим мизерным опытом(которого нет пока) я не знаю, почему так. Объясните пожалуйста. А файл что-то не прилагается
L1aQu Попытаюсь ответить... хотя сомневаюсь, что у меня опыта побольше. При вызове CALL 011B в стек кладется адрес возврата из процедуры (как раз адрес следующей инструкции: 0117). А Ваш CX хранится теперь чуть глубже по стеку (подозреваю, что байта этак на четыре). Поэтому достать Ваш СХ можно с помощью Код (Text): mov bp, sp add sp, 4 pop cx mov sp, bp Способ очень глупый. Это я так: для наглядности. А на самом деле чаще всего используется косвенная адресация с использованием bp для доступа к аргументам.
Проверил, после int 10 - CX = 0510 l_inc Сейчас буду пробовать. Стек - капризная штука. А машинный код я вот только сегодня изучать начал, отсюда и непонятные места.
L1aQu Посмотри описание команды call (она записывает адрес возврата в стэк, а ты его как раз и извлекаешь). Код (Text): push cx mov cx, 4 call 011b LOOP 0114 INT 20 MOV BL,CL push bp ; сохраняем регистр bp mov bp, sp mov cx, [bp+4] ; так как в стэке bp и адрес возврата, +4 потому что формат слова у bp и у адреса возврата pop bp ; востанавливаем регистр bp