Intel Assembly Programming - PullRequest
       12

Intel Assembly Programming

0 голосов
/ 30 апреля 2010
class MyString{
char buf[100];
int len;

boolean append(MyString str){

int k;
if(this.len + str.len>100){

for(k=0; k<str.len; k++){
  this.buf[this.len] = str.buf[k];
  this.len ++;
}
 return false;
}

return true;

}
}

Переводит ли вышесказанное на:

start:
  push ebp  ; save calling  ebp
  mov ebp, esp  ; setup new ebp
  push esi  ;  
  push ebx  ;  
  mov esi, [ebp + 8]  ;  esi = 'this'
  mov ebx, [ebp + 14]  ;  ebx = str
  mov ecx, 0  ; k=0
  mov edx, [esi + 200] ;  edx = this.len

append:
  cmp edx + [ebx + 200], 100  
  jle ret_true  ; if (this.len + str.len)<= 100 then ret_true
  cmp ecx, edx
  jge ret_false  ; if k >= str.len then ret_false
  mov [esi + edx], [ebx + 2*ecx]  ; this.buf[this.len] = str.buf[k]
  inc edx  ;  this.len++

aux:
  inc ecx  ; k++
  jmp append

ret_true:
  pop ebx  ; restore ebx
  pop esi  ; restore esi
  pop ebp  ; restore ebp
  ret true

ret_false:
  pop ebx  ; restore ebx
  pop esi  ; restore esi
  pop ebp  ; restore ebp
  ret false

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

Примечание: Мне не разрешено использовать глобальные переменные, и я должен принимать 32-битные целые, 16-битные символы и 8-битные логические значения.

1 Ответ

3 голосов
/ 30 апреля 2010

Похоже, у вас есть назначение, чтобы создать код сборки Intel x86, который выполняет операцию добавления строки.

Если это правда, вам может быть полезно изучить дизассемблированный вывод компилятора C - например, компилятора Intel C или компилятора Microsoft VC ++ Express. Скомпилируйте действительно простой C-код, затем разберите и посмотрите на результаты.

Компиляторы обычно делают вещи немного по-другому, чем человеческий кодер, но по моему опыту нетрудно выяснить, что происходит в сгенерированном коде. Вы можете увидеть, как код ASM управляет стеком, как выполняется арифметика указателей, как и когда инициализируются регистры, какие регистры используются и как, и так далее.

Простая подпрограмма на Си может быть вашей собственной версией strlen.

Затем добавьте сложность или измените все, скомпилируйте и снова разберите и посмотрите, что произойдет. Например, вместо strlen создайте подпрограмму C, которая возвращает последний символ в строке.

или, если вы просто хотите получить ответ, вы можете попробовать Codecodex . :)

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