簡體   English   中英

從內存地址幫助(程序集)復制單詞

[英]Copying words from memory address assistance (assembly)

我正在嘗試從內存中復制一些單詞,並使用匯編將其保存到另一個內存地址。 我正在嘗試為其編寫代碼,但是我不確定某些部分。 我將簡要描述我想做什么。

源地址,目標地址和要復制的單詞數是函數的輸入參數。

根據您的描述,這聽起來像是常規的memcpy,只是您指定要復制的字數而不是字節數。 不知道整個堆棧緩沖區的想法從哪里來?

這樣的事情會將單詞從源復制到目標地址:

sll $a2,$a2,2
addu $a2,$a1,$a2  ; $a2 = address of first byte past the dest buffer
Loop:
    lw $t0,0($a0)
    sw $t0,0($a1)
    addiu $a0,$a0,4
    addiu $a1,$a1,4
    bne $a1,$a2,Loop
    nop

編輯:如果您的源緩沖區和目標緩沖區未在字邊界上對齊,則需要使用lb / sb來避免數據對齊異常。

編輯:分支后添加點

因此,請考慮一下如何在C語言中進行此操作。

unsigned int *src,*dst;
unsigned int len;
unsigned int temp;
...
//assume *src, and *dst and len are filled in by this point
top:
  temp=*src;
  *dst=temp;
  src++;
  dst++;
  len--;
  if(len) goto top;

您正在混合太多東西,只專注於一個計划。 首先,您說您在兩個寄存器中有一個源地址和目標地址,為什么要涉及堆棧? 您沒有在復制或使用堆棧,而是在使用兩個地址。

乘以4以獲得字節數是正確的,但是如果您一次復制一個單詞,則無需計數字節,只需單詞。 這是假設源地址和目標地址是對齊的,或者您不必對齊。 (如果未對齊,則一次做一個字節一次)。

所以這在匯編中是什么樣子,可以轉換為mips,這是偽代碼:rs是源寄存器$ a0,rd是目標寄存器$ a1,rx是長度寄存器$ a2,rt是臨時寄存器。 現在,如果要從內存中加載一個字,請使用加載字(lw)指令,如果要加載一個字節,請執行lb(加載字節)。

top:
branch_if_equal rx,0,done
nop
load_word rt,(rs)
store_word rt,(rd)
add rs,rs,4
add rd,rd,4
subtract rx,rx,1
branch top
nop
done:

現在,如果您一次復制字節而不是單詞,則

shift_left rx,2
top:
branch_if_equal rx,0,done
nop
load_byte rt,(rs)
store_byte rt,(rd)
add rs,rs,1
add rd,rd,1
subtract rx,rx,1
branch top
nop
done:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM