x86 Struct scanf

时间:2014-04-12 17:37:04

标签: c assembly x86

我正在尝试将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

2 个答案:

答案 0 :(得分:0)

month_of_birth下,您有push ax而不是push eax。这将仅推送堆栈上地址的低16位,从而实际上保证了scanf中的崩溃。修复它,它应该没问题。

答案 1 :(得分:0)

您的代码中发生了许多奇怪/错误的事情。显示更清洁的方式会更容易。你没有提到你正在使用的汇编程序,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条记录的输入和输出:
enter image description here