2013-11-05 57 views
0

我試圖在x86-64中掃描並存儲雙字數組。 我已經找遍了,似乎無法找到任何我明白的東西。 我的程序應該掃描並打印雙字數組的所有元素。在x86程序集中掃描數組

我看了很多例子,但我似乎無法使用它們 - 它們給我編譯錯誤。 此外,我似乎無法使用類似 - MOVQ%RSI,[陣列+ 8]

這裏是我的代碼:

.data 
.comm arr, 800    # int arr[100]; 
.comm p, 8     # int pointer; 
.comm c, 8 
.comm c2, 8 
.comm c3, 8 
arr  dd 100 DUP(0) 
.text 
format1: 
     .string "Enter integers followed by EOF\n" 

format2: 
     .string "%ld" 

format3: 
     .string "a is %ld\n" 

.globl main 
main:         # main() 
     movq $format1, %rdi   # printf("Enter integers followed by E 
     movq $0, %rax    # 
     call printf     # 
     movq $arr, %r8 
     movq $0, c 
     movq $0, c2 

     whileloop: 
     movq $format2, %rdi   # scanf("%ld",&a); 
     movq $p, %rsi    # 
     movq %rsi, %r8 
     movq $0, %rax    # 
     call scanf     # 
     cmpq $0, %rsi    # if(arr[ptr] == 0) 
     je  endwhileloop 
     addq $8, %r8 
     addq $1, c 
     jmp  whileloop 
     endwhileloop: 
     movq $format3, %rdi # printf("a=%ld",a); 
     movq $p,%rsi  # 
     movq (%rsi),%rsi # 
     movq $0, %rax  # 
     call printf   # 
     ret 

這是不正確的存儲陣列在一個事實「常用3」。 謝謝!

+0

什麼彙編您使用的?除了註釋和指令外,這看起來像gas語法。 –

+0

另外:爲什麼不用C編寫簡單的程序,然後反彙編呢? –

+0

AMD x86-64。我也嘗試過。將再次放棄它。謝謝 – newton52

回答

0

這似乎工作,也許不完全符合要求。你有幾個問題,包括你最終的printf只被調用一次; ret指令在最後導致段錯誤,因爲沒有什麼要返回;和nasm語法中的行arr dd 100 dup(0)

這裏的更正彙編語言:

.data 
.comm arr, 800    # int arr[100]; 
.comm p, 8     # int pointer; 
.comm c, 8 
.comm c2, 8 
.comm c3, 8 
.text 
format1: 
     .string "Enter integers followed by EOF\n" 

format2: 
     .string "%ld" 

format3: 
     .string "a is %ld\n" 

.globl _start 
_start:         # main() 
     movq $format1, %rdi   # printf("Enter integers followed by E 
     movq $0, %rax    # 
     call printf     # 
     movq $arr, %r8 
     movq $0, c 
     movq $0, c2 

whileloop: 
     movq $format2, %rdi   # scanf("%ld",&a); 
     movq $p, %rsi    # 
     movq %rsi, %r8 
     movq $0, %rax    # 
     call scanf     # 
     cmpq $0, %rsi    # if(arr[ptr] == 0) 
     je  endwhileloop 
     addq $8, %r8 
     addq $1, c 
     movq $format3, %rdi # printf("a=%ld",a); 
     movq $p,%rsi  # 
     movq (%rsi),%rsi # 
     movq $0, %rax  # 
     call printf   # 
     jmp  whileloop 
endwhileloop: 
     xor  %rbx, %rbx 
     call exit 

和Makefile文件爲我的32位Debian的系統:

all: test 
%.o: %.as 
    as -o [email protected] --64 $< 
%: %.o 
    ld -melf_x86_64 -o [email protected] -lc \ 
    -dynamic-linker /lib64/ld-linux-x86-64.so.2 \ 
    $< 

輸出:

[email protected]:~/stackoverflow/19780206$ ./test 
Enter integers followed by EOF 
1234 5667 67899 
a is 1234 
a is 5667 
a is 67899 
^D