место ввода переключателя в сборке памяти

# #assembly #x86

#собрание #x86

Вопрос:

Мне нужно отсортировать массив в одном процессе, и тогда наименьшее число должно поменяться местами с первым числом . чем второе меньшее число со вторым числом и так далее… Мой только что написал 00 00 00 00 в ds:0000

 proc min  push bx  push ax  mov si,bx   inc bx  checkminnum: ; the outer loop for checking all the numbers  mov al, [byte ptr si]  cmp [byte ptr bx] , al  jb smaller   mov si, bx; the offset of the smaller num is saved in si  smaller:  inc bx  cmp [byte ptr bx], '


Комментарии:

1. "Мой только что написал 00 00 00 00" Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, - это вставка в порядке возрастания.

 ; IN (bx) OUT (al='

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

 ; IN () OUT () MOD (al,cl,dl) proc swap  push bx  push si  mov bx, offset array  More:  call min ; -gt; AL='

Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.



; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], '

Комментарии:

1. "Мой только что написал 00 00 00 00" Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, - это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. "Мой только что написал 00 00 00 00" Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, - это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

,si) MOD () proc min push bx SetMin: mov si, bx ; Position of minimum Cont: inc bx mov al, [bx] cmp al, 'В процессе подкачки, если положение минимума равно текущему фронту массива, лучше вообще не менять элементы местами.
И вместо того , чтобы использовать стек и работать с одним регистром AL , используйте дополнительные регистры, такие как CL и DL для повышения эффективности.


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], '

Комментарии:

1. "Мой только что написал 00 00 00 00" Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, - это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. "Мой только что написал 00 00 00 00" Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, - это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

je Done cmp al, [si] ; Compare with current minimum jb SetMin ; Smaller, so record position jmp Cont ; Not smaller, so just continue Done: pop bx ret endp min

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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], ‘

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

SI cmp si, bx je Skip mov cl, [bx] mov dl, [si] mov [bx], dl mov [si], cl Skip: inc bx cmp [bx], al ; AL=’Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], ‘

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

,si) MOD () proc min push bx SetMin: mov si, bx ; Position of minimum Cont: inc bx mov al, [bx] cmp al, ‘В процессе подкачки, если положение минимума равно текущему фронту массива, лучше вообще не менять элементы местами.
И вместо того , чтобы использовать стек и работать с одним регистром AL , используйте дополнительные регистры, такие как CL и DL для повышения эффективности.


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], ‘

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

je Done cmp al, [si] ; Compare with current minimum jb SetMin ; Smaller, so record position jmp Cont ; Not smaller, so just continue Done: pop bx ret endp min

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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], ‘

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne More pop si pop bx ret endp swapНедостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], ‘

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

,si) MOD () proc min push bx SetMin: mov si, bx ; Position of minimum Cont: inc bx mov al, [bx] cmp al, ‘В процессе подкачки, если положение минимума равно текущему фронту массива, лучше вообще не менять элементы местами.
И вместо того , чтобы использовать стек и работать с одним регистром AL , используйте дополнительные регистры, такие как CL и DL для повышения эффективности.


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], ‘

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

je Done cmp al, [si] ; Compare with current minimum jb SetMin ; Smaller, so record position jmp Cont ; Not smaller, so just continue Done: pop bx ret endp min

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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

; check when the loop should end jne checkminnum pop ax pop bx ret endp min proc swap push bx mov bx, offset array repos: call min mov al, [byte ptr bx] push ax mov al, [byte ptr si] mov [byte ptr bx], al pop ax mov [byte ptr si], al inc bx cmp [byte ptr bx], ‘

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.

jne repos pop bx ret endp swap

Комментарии:

1. «Мой только что написал 00 00 00 00» Для какого ввода? Кроме того, мне кажется, что jb в вашей min функции должно быть ja (или переключить порядок операндов cmp ). Вы просматривали свой код в отладчике, чтобы увидеть, что происходит в каждой строке?

2. Вы пробовали отладить его одним шагом, чтобы увидеть, где он отличается от того, что вы ожидаете?

3. @майкл , 5,7,8,0,12,6,$

Ответ №1:

Минимальный процесс показывает эти две ошибки:

  • Вы используете условие, противоположное тому, которое вам нужно было бы для того, чтобы найти минимум.
  • Ваш код на своей последней итерации будет обрабатывать $-терминатор, как если бы он был элементом массива. Вы должны проверить наличие терминатора перед сравнением со следующим элементом массива, поскольку указанный элемент может не существовать.

То, что делает код, — это вставка в порядке возрастания.


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


Недостатком использования терминатора для работы с вашим массивом является то, что значение 36 (ASCII-код символа$) не может отображаться в самом массиве.