簡體   English   中英

x86結構掃描

[英]x86 Struct scanf

我正在嘗試將C轉換為x86。 我正在使用結構...

struct person_record_struct
{
  char last_name[128];
  char first_name[128];
  char year_of_birth[10];
  int month_of_birth; // January => 1
  int day_of_birth; // 1st Day of a Month => 1
  char drivers_license_no[128];
};
typedef struct person_record_struct person_record;

我無法讓我的scanf工作。 這是C ..

result = scanf("%s\n%s\n%s\n%d\n%d\n%s\n", &records[counter].last_name[0],     

&records[counter].first_name[0], &records[counter].year_of_birth[0],     

&records[counter].month_of_birth, &records[counter].day_of_birth, 

&records[counter].drivers_license_no[0]);

還有我的x86

;counter @ [ebp-4]
;records @ [ebp-16]
; format_string_main_2 db '%s\n%s\n%s\n%d\n%d\n%s\n', 0
; read in info

; push drivers_license_no
mov ebx, [ebp-16]   ;
mov eax, [ebp-4]        
mov ecx, struct_size
mul ecx                 
add eax, ebx            
lea eax, [eax+276]  
push eax

; push day_of_birth
mov ebx, [ebp-16]   
mov eax, [ebp-4]       
mov ecx, struct_size
mul ecx            
add eax, ebx            
lea eax, [eax+272]  
push eax

; push month_of_birth
mov ebx, [ebp-16]   
mov eax, [ebp-4]      
mov ecx, struct_size
mul ecx               
add eax, ebx            
lea eax, [eax+268]  
push ax

; push year_of_birth
mov ebx, [ebp-16]   
mov eax, [ebp-4]      
mov ecx, struct_size
mul ecx                 
add eax, ebx          
lea eax, [eax+256]  
push eax

; push first_name
mov ebx, [ebp-16]   
mov eax, [ebp-4]        
mov ecx, struct_size
mul ecx               
add eax, ebx          
lea eax, [eax+128]  
push eax

; push last_name
mov ebx, [ebp-16]   
mov eax, [ebp-4]       
mov ecx, struct_size
mul ecx             
add eax, ebx           
lea eax, [eax+0]       
push eax

push format_string_main_2     
call scanf
add esp, 28
mov [ebp-12], eax

我正在檢查結果是否為6,是否不是打印錯誤並退出的程序。 它一直有錯誤,我不確定自己在做什么錯。 任何幫助將非常感激。 謝謝。

這是我的calloc電話,看來是正確的...

;  // allocate the buffer of all the records
;  records = (person_record *)calloc(number_of_records, sizeof(person_record));

push struct_size
mov eax, [ebp-8]
push eax
call calloc
add esp, 8
mov [ebp-16], eax

month_of_birthpush ax ,而不是push eax 這只會將地址的低16位壓入堆棧,實際上保證了scanf的崩潰。 修復該問題,應該可以。

您的代碼中發生了很多奇怪/錯誤的事情。 顯示一種更清潔的方法會更容易。 您沒有提到正在使用的匯編器,x86有幾個,每個都有自己的語法。 使用NASM的方法如下:

extern printf, scanf, calloc, exit, free, puts
global main

struc person_record
    .last_name           resb    128
    .first_name          resb    128
    .year_of_birth       resb    10
    .month_of_birth      resd    1
    .day_of_birth        resd    1
    .drivers_license_no  resb    128
    .size equ   $ - person_record
endstruc

MAX_RECORDS     equ 2

section .data
Space              db  32, 0
input_format    db "%s%s%s%d%d%s", 0
output_format   db  "%s %s %s %d %d %s", 0

section .text
main:

    push    person_record.size
    push    MAX_RECORDS    
    call    calloc
    add     esp, 4 * 2
    mov     esi, eax
    mov     ebx, eax

    mov     edi, MAX_RECORDS - 1
.FillRecord:    
    lea     eax, [ebx + person_record.drivers_license_no]
    push    eax
    lea     ecx, [ebx + person_record.day_of_birth]
    push    ecx
    lea     edx, [ebx + person_record.month_of_birth]
    push    edx
    lea     eax, [ebx + person_record.year_of_birth]
    push    eax
    lea     ecx, [ebx + person_record.first_name]
    push    ecx
    lea     edx, [ebx + person_record.last_name]
    push    edx
    push    input_format
    call    scanf
    add     esp, 4 * 7

    push    Space
    call    puts
    add     esp, 4 * 1

    add     ebx, person_record.size
    dec     edi
    jns     .FillRecord

    mov     ebx, esi
    mov     edi, MAX_RECORDS - 1
.ShowRecord:    
    lea     eax, [ebx + person_record.drivers_license_no]
    push    eax
    mov     ecx, [ebx + person_record.day_of_birth]
    push    ecx
    mov     edx, [ebx + person_record.month_of_birth]
    push    edx
    lea     eax, [ebx + person_record.year_of_birth]
    push    eax
    lea     ecx, [ebx + person_record.first_name]
    push    ecx
    lea     edx, [ebx + person_record.last_name]
    push    edx
    push    output_format
    call    printf
    add     esp, 4 * 7

    push    Space
    call    puts
    add     esp, 4 * 1

    add     ebx, person_record.size
    dec     edi
    jns     .ShowRecord

    push    esi
    call    free
    add     esp, 4 * 1

    push    0
    call    exit

並輸入和輸出2條記錄:
在此處輸入圖片說明

暫無
暫無

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

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